Fix class expression from being assignable if types don't match (#40660)

* Fix class expression from being assignable if types don't match

* Fix class expression from being assignable if types don't match
This commit is contained in:
Tiago Tristao
2020-10-05 21:21:38 +01:00
committed by GitHub
parent 77df9faabf
commit 1191e2e731
6 changed files with 63 additions and 1 deletions

View File

@@ -28180,7 +28180,7 @@ namespace ts {
let name: Expression | BindingName | undefined;
let decl: Node | undefined;
if (isVariableDeclaration(node.parent) && node.parent.initializer === node) {
if (!isInJSFile(node) && !isVarConst(node.parent)) {
if (!isInJSFile(node) && !(isVarConst(node.parent) && isFunctionLikeDeclaration(node))) {
return undefined;
}
name = node.parent.name;

View File

@@ -0,0 +1,16 @@
tests/cases/compiler/classExpressionAssignment.ts(6,7): error TS2322: Type 'typeof A' is not assignable to type 'new () => A'.
Property 'prop' is missing in type 'A' but required in type 'A'.
==== tests/cases/compiler/classExpressionAssignment.ts (1 errors) ====
interface A {
prop: string;
}
// This is invalid
const A: {new(): A} = class {}
~
!!! error TS2322: Type 'typeof A' is not assignable to type 'new () => A'.
!!! error TS2322: Property 'prop' is missing in type 'A' but required in type 'A'.
!!! related TS2728 tests/cases/compiler/classExpressionAssignment.ts:2:3: 'prop' is declared here.

View File

@@ -0,0 +1,16 @@
//// [classExpressionAssignment.ts]
interface A {
prop: string;
}
// This is invalid
const A: {new(): A} = class {}
//// [classExpressionAssignment.js]
// This is invalid
var A = /** @class */ (function () {
function A() {
}
return A;
}());

View File

@@ -0,0 +1,13 @@
=== tests/cases/compiler/classExpressionAssignment.ts ===
interface A {
>A : Symbol(A, Decl(classExpressionAssignment.ts, 0, 0), Decl(classExpressionAssignment.ts, 5, 5))
prop: string;
>prop : Symbol(A.prop, Decl(classExpressionAssignment.ts, 0, 13))
}
// This is invalid
const A: {new(): A} = class {}
>A : Symbol(A, Decl(classExpressionAssignment.ts, 0, 0), Decl(classExpressionAssignment.ts, 5, 5))
>A : Symbol(A, Decl(classExpressionAssignment.ts, 0, 0), Decl(classExpressionAssignment.ts, 5, 5))

View File

@@ -0,0 +1,11 @@
=== tests/cases/compiler/classExpressionAssignment.ts ===
interface A {
prop: string;
>prop : string
}
// This is invalid
const A: {new(): A} = class {}
>A : new () => A
>class {} : typeof A

View File

@@ -0,0 +1,6 @@
interface A {
prop: string;
}
// This is invalid
const A: {new(): A} = class {}