mirror of
https://github.com/microsoft/TypeScript.git
synced 2025-11-18 17:21:48 +00:00
fix(53645): JSDoc extends doesn't work with multiple lines (#53705)
This commit is contained in:
@@ -9244,7 +9244,9 @@ namespace Parser {
|
||||
const usedBrace = parseOptional(SyntaxKind.OpenBraceToken);
|
||||
const pos = getNodePos();
|
||||
const expression = parsePropertyAccessEntityNameExpression();
|
||||
scanner.setInJSDocType(true);
|
||||
const typeArguments = tryParseTypeArguments();
|
||||
scanner.setInJSDocType(false);
|
||||
const node = factory.createExpressionWithTypeArguments(expression, typeArguments) as ExpressionWithTypeArguments & { expression: Identifier | PropertyAccessEntityNameExpression };
|
||||
const res = finishNode(node, pos);
|
||||
if (usedBrace) {
|
||||
|
||||
@@ -0,0 +1,65 @@
|
||||
/a.js(29,16): error TS2344: Type '{ a: string; b: string; }' does not satisfy the constraint 'Foo'.
|
||||
Types of property 'b' are incompatible.
|
||||
Type 'string' is not assignable to type 'boolean | string[]'.
|
||||
/a.js(42,16): error TS2344: Type '{ a: string; b: string; }' does not satisfy the constraint 'Foo'.
|
||||
Types of property 'b' are incompatible.
|
||||
Type 'string' is not assignable to type 'boolean | string[]'.
|
||||
|
||||
|
||||
==== /a.js (2 errors) ====
|
||||
/**
|
||||
* @typedef {{
|
||||
* a: number | string;
|
||||
* b: boolean | string[];
|
||||
* }} Foo
|
||||
*/
|
||||
|
||||
/**
|
||||
* @template {Foo} T
|
||||
*/
|
||||
class A {
|
||||
/**
|
||||
* @param {T} a
|
||||
*/
|
||||
constructor(a) {
|
||||
return a
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @extends {A<{
|
||||
* a: string,
|
||||
* b: string[]
|
||||
* }>}
|
||||
*/
|
||||
class B extends A {}
|
||||
|
||||
/**
|
||||
* @extends {A<{
|
||||
~
|
||||
* a: string,
|
||||
~~~~~~~~~~~~~~~~~
|
||||
* b: string
|
||||
~~~~~~~~~~~~~~~~
|
||||
* }>}
|
||||
~~~~
|
||||
!!! error TS2344: Type '{ a: string; b: string; }' does not satisfy the constraint 'Foo'.
|
||||
!!! error TS2344: Types of property 'b' are incompatible.
|
||||
!!! error TS2344: Type 'string' is not assignable to type 'boolean | string[]'.
|
||||
*/
|
||||
class C extends A {}
|
||||
|
||||
/**
|
||||
* @extends {A<{a: string, b: string[]}>}
|
||||
*/
|
||||
class D extends A {}
|
||||
|
||||
/**
|
||||
* @extends {A<{a: string, b: string}>}
|
||||
~~~~~~~~~~~~~~~~~~~~~~
|
||||
!!! error TS2344: Type '{ a: string; b: string; }' does not satisfy the constraint 'Foo'.
|
||||
!!! error TS2344: Types of property 'b' are incompatible.
|
||||
!!! error TS2344: Type 'string' is not assignable to type 'boolean | string[]'.
|
||||
*/
|
||||
class E extends A {}
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
=== /a.js ===
|
||||
/**
|
||||
* @typedef {{
|
||||
* a: number | string;
|
||||
* b: boolean | string[];
|
||||
* }} Foo
|
||||
*/
|
||||
|
||||
/**
|
||||
* @template {Foo} T
|
||||
*/
|
||||
class A {
|
||||
>A : Symbol(A, Decl(a.js, 0, 0))
|
||||
|
||||
/**
|
||||
* @param {T} a
|
||||
*/
|
||||
constructor(a) {
|
||||
>a : Symbol(a, Decl(a.js, 14, 15))
|
||||
|
||||
return a
|
||||
>a : Symbol(a, Decl(a.js, 14, 15))
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @extends {A<{
|
||||
* a: string,
|
||||
* b: string[]
|
||||
* }>}
|
||||
*/
|
||||
class B extends A {}
|
||||
>B : Symbol(B, Decl(a.js, 17, 1))
|
||||
>A : Symbol(A, Decl(a.js, 0, 0))
|
||||
|
||||
/**
|
||||
* @extends {A<{
|
||||
* a: string,
|
||||
* b: string
|
||||
* }>}
|
||||
*/
|
||||
class C extends A {}
|
||||
>C : Symbol(C, Decl(a.js, 25, 20))
|
||||
>A : Symbol(A, Decl(a.js, 0, 0))
|
||||
|
||||
/**
|
||||
* @extends {A<{a: string, b: string[]}>}
|
||||
*/
|
||||
class D extends A {}
|
||||
>D : Symbol(D, Decl(a.js, 33, 20))
|
||||
>A : Symbol(A, Decl(a.js, 0, 0))
|
||||
|
||||
/**
|
||||
* @extends {A<{a: string, b: string}>}
|
||||
*/
|
||||
class E extends A {}
|
||||
>E : Symbol(E, Decl(a.js, 38, 20))
|
||||
>A : Symbol(A, Decl(a.js, 0, 0))
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
=== /a.js ===
|
||||
/**
|
||||
* @typedef {{
|
||||
* a: number | string;
|
||||
* b: boolean | string[];
|
||||
* }} Foo
|
||||
*/
|
||||
|
||||
/**
|
||||
* @template {Foo} T
|
||||
*/
|
||||
class A {
|
||||
>A : A<T>
|
||||
|
||||
/**
|
||||
* @param {T} a
|
||||
*/
|
||||
constructor(a) {
|
||||
>a : T
|
||||
|
||||
return a
|
||||
>a : T
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @extends {A<{
|
||||
* a: string,
|
||||
* b: string[]
|
||||
* }>}
|
||||
*/
|
||||
class B extends A {}
|
||||
>B : B
|
||||
>A : A<{ a: string; b: string[]; }>
|
||||
|
||||
/**
|
||||
* @extends {A<{
|
||||
* a: string,
|
||||
* b: string
|
||||
* }>}
|
||||
*/
|
||||
class C extends A {}
|
||||
>C : C
|
||||
>A : A<{ a: string; b: string; }>
|
||||
|
||||
/**
|
||||
* @extends {A<{a: string, b: string[]}>}
|
||||
*/
|
||||
class D extends A {}
|
||||
>D : D
|
||||
>A : A<{ a: string; b: string[]; }>
|
||||
|
||||
/**
|
||||
* @extends {A<{a: string, b: string}>}
|
||||
*/
|
||||
class E extends A {}
|
||||
>E : E
|
||||
>A : A<{ a: string; b: string; }>
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
// @checkJs: true
|
||||
// @allowJs: true
|
||||
// @noEmit: true
|
||||
// @filename: /a.js
|
||||
|
||||
/**
|
||||
* @typedef {{
|
||||
* a: number | string;
|
||||
* b: boolean | string[];
|
||||
* }} Foo
|
||||
*/
|
||||
|
||||
/**
|
||||
* @template {Foo} T
|
||||
*/
|
||||
class A {
|
||||
/**
|
||||
* @param {T} a
|
||||
*/
|
||||
constructor(a) {
|
||||
return a
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @extends {A<{
|
||||
* a: string,
|
||||
* b: string[]
|
||||
* }>}
|
||||
*/
|
||||
class B extends A {}
|
||||
|
||||
/**
|
||||
* @extends {A<{
|
||||
* a: string,
|
||||
* b: string
|
||||
* }>}
|
||||
*/
|
||||
class C extends A {}
|
||||
|
||||
/**
|
||||
* @extends {A<{a: string, b: string[]}>}
|
||||
*/
|
||||
class D extends A {}
|
||||
|
||||
/**
|
||||
* @extends {A<{a: string, b: string}>}
|
||||
*/
|
||||
class E extends A {}
|
||||
Reference in New Issue
Block a user