From d572a54d152a1bbd5cb9f4351eecfe417dc99689 Mon Sep 17 00:00:00 2001 From: Ron Buckton Date: Sun, 30 Apr 2017 22:27:31 -0700 Subject: [PATCH] Report errors from duplicate member names --- src/compiler/checker.ts | 7 +- src/compiler/diagnosticMessages.json | 4 + tests/baselines/reference/dynamicNames.js | 8 - .../baselines/reference/dynamicNames.symbols | 226 ++++++++---------- tests/baselines/reference/dynamicNames.types | 15 -- .../reference/dynamicNamesErrors.errors.txt | 15 +- .../baselines/reference/dynamicNamesErrors.js | 6 + tests/cases/compiler/dynamicNames.ts | 7 - tests/cases/compiler/dynamicNamesErrors.ts | 6 + 9 files changed, 139 insertions(+), 155 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index b091388ed8e..e811b83844c 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -1815,7 +1815,7 @@ namespace ts { } function getSymbolOfNode(node: Node): Symbol { - return getMergedSymbol(node.symbol); + return getMergedSymbol(node.symbol && node.symbol.name === "__computed" && node.id && getNodeLinks(node).resolvedSymbol || node.symbol); } function getParentOfSymbol(symbol: Symbol): Symbol { @@ -19502,7 +19502,10 @@ namespace ts { // initializer is consistent with type associated with the node const declarationType = convertAutoToAny(getWidenedTypeForVariableLikeDeclaration(node)); if (type !== unknownType && declarationType !== unknownType && !isTypeIdenticalTo(type, declarationType)) { - error(node.name, Diagnostics.Subsequent_variable_declarations_must_have_the_same_type_Variable_0_must_be_of_type_1_but_here_has_type_2, declarationNameToString(node.name), typeToString(type), typeToString(declarationType)); + const message = node.kind === SyntaxKind.PropertyDeclaration || node.kind === SyntaxKind.PropertySignature + ? Diagnostics.Subsequent_property_declarations_must_have_the_same_type_Property_0_must_be_of_type_1_but_here_has_type_2 + : Diagnostics.Subsequent_variable_declarations_must_have_the_same_type_Variable_0_must_be_of_type_1_but_here_has_type_2; + error(node.name, message, declarationNameToString(node.name), typeToString(type), typeToString(declarationType)); } if (node.initializer) { checkTypeAssignableTo(checkExpressionCached(node.initializer), declarationType, node, /*headMessage*/ undefined); diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index b69adf708f2..6092e919760 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -2123,6 +2123,10 @@ "category": "Error", "code": 2710 }, + "Subsequent property declarations must have the same type. Property '{0}' must be of type '{1}', but here has type '{2}'.": { + "category": "Error", + "code": 2711 + }, "Import declaration '{0}' is using private name '{1}'.": { "category": "Error", diff --git a/tests/baselines/reference/dynamicNames.js b/tests/baselines/reference/dynamicNames.js index b5462f91c78..766494683e1 100644 --- a/tests/baselines/reference/dynamicNames.js +++ b/tests/baselines/reference/dynamicNames.js @@ -44,7 +44,6 @@ namespace N { const c4 = "a"; const c5 = 1; -const c6 = "1"; interface T8 { [c4]: number; @@ -76,12 +75,6 @@ declare type T15 = { 1: string; }; -interface T16 { - [c5]: number; - [c6]: string; -} - - let t0: T0; let t1: T1; let t2: T2; @@ -123,7 +116,6 @@ var N; })(N || (N = {})); const c4 = "a"; const c5 = 1; -const c6 = "1"; let t0; let t1; let t2; diff --git a/tests/baselines/reference/dynamicNames.symbols b/tests/baselines/reference/dynamicNames.symbols index fec309e2937..09970da02e1 100644 --- a/tests/baselines/reference/dynamicNames.symbols +++ b/tests/baselines/reference/dynamicNames.symbols @@ -113,11 +113,8 @@ const c4 = "a"; const c5 = 1; >c5 : Symbol(c5, Decl(main.ts, 24, 5)) -const c6 = "1"; ->c6 : Symbol(c6, Decl(main.ts, 25, 5)) - interface T8 { ->T8 : Symbol(T8, Decl(main.ts, 25, 15)) +>T8 : Symbol(T8, Decl(main.ts, 24, 13)) [c4]: number; >c4 : Symbol(c4, Decl(main.ts, 23, 5)) @@ -126,8 +123,8 @@ interface T8 { >c5 : Symbol(c5, Decl(main.ts, 24, 5)) } declare class T9 implements T8 { ->T9 : Symbol(T9, Decl(main.ts, 30, 1)) ->T8 : Symbol(T8, Decl(main.ts, 25, 15)) +>T9 : Symbol(T9, Decl(main.ts, 29, 1)) +>T8 : Symbol(T8, Decl(main.ts, 24, 13)) [c4]: number; >c4 : Symbol(c4, Decl(main.ts, 23, 5)) @@ -136,11 +133,11 @@ declare class T9 implements T8 { >c5 : Symbol(c5, Decl(main.ts, 24, 5)) } declare class T10 extends T9 { ->T10 : Symbol(T10, Decl(main.ts, 34, 1)) ->T9 : Symbol(T9, Decl(main.ts, 30, 1)) +>T10 : Symbol(T10, Decl(main.ts, 33, 1)) +>T9 : Symbol(T9, Decl(main.ts, 29, 1)) } declare type T11 = { ->T11 : Symbol(T11, Decl(main.ts, 36, 1)) +>T11 : Symbol(T11, Decl(main.ts, 35, 1)) [c4]: number; >c4 : Symbol(c4, Decl(main.ts, 23, 5)) @@ -151,202 +148,191 @@ declare type T11 = { }; interface T12 { ->T12 : Symbol(T12, Decl(main.ts, 40, 2)) +>T12 : Symbol(T12, Decl(main.ts, 39, 2)) a: number; ->a : Symbol(T12.a, Decl(main.ts, 42, 15)) +>a : Symbol(T12.a, Decl(main.ts, 41, 15)) 1: string; } declare class T13 implements T2 { ->T13 : Symbol(T13, Decl(main.ts, 45, 1)) +>T13 : Symbol(T13, Decl(main.ts, 44, 1)) >T2 : Symbol(T2, Decl(main.ts, 0, 24)) a: number; ->a : Symbol(T13.a, Decl(main.ts, 46, 33)) +>a : Symbol(T13.a, Decl(main.ts, 45, 33)) 1: string; } declare class T14 extends T13 { ->T14 : Symbol(T14, Decl(main.ts, 49, 1)) ->T13 : Symbol(T13, Decl(main.ts, 45, 1)) +>T14 : Symbol(T14, Decl(main.ts, 48, 1)) +>T13 : Symbol(T13, Decl(main.ts, 44, 1)) } declare type T15 = { ->T15 : Symbol(T15, Decl(main.ts, 51, 1)) +>T15 : Symbol(T15, Decl(main.ts, 50, 1)) a: number; ->a : Symbol(a, Decl(main.ts, 52, 20)) +>a : Symbol(a, Decl(main.ts, 51, 20)) 1: string; }; -interface T16 { ->T16 : Symbol(T16, Decl(main.ts, 55, 2)) - - [c5]: number; ->c5 : Symbol(c5, Decl(main.ts, 24, 5)) - - [c6]: string; ->c6 : Symbol(c6, Decl(main.ts, 25, 5)) -} - - let t0: T0; ->t0 : Symbol(t0, Decl(main.ts, 63, 3)) +>t0 : Symbol(t0, Decl(main.ts, 56, 3)) >T0 : Symbol(T0, Decl(main.ts, 0, 16)) let t1: T1; ->t1 : Symbol(t1, Decl(main.ts, 64, 3)) +>t1 : Symbol(t1, Decl(main.ts, 57, 3)) >T1 : Symbol(T1, Decl(main.ts, 0, 20)) let t2: T2; ->t2 : Symbol(t2, Decl(main.ts, 65, 3)) +>t2 : Symbol(t2, Decl(main.ts, 58, 3)) >T2 : Symbol(T2, Decl(main.ts, 0, 24)) let t3: T3; ->t3 : Symbol(t3, Decl(main.ts, 66, 3)) +>t3 : Symbol(t3, Decl(main.ts, 59, 3)) >T3 : Symbol(T3, Decl(main.ts, 0, 28)) let t0_1: M.T0; ->t0_1 : Symbol(t0_1, Decl(main.ts, 67, 3)) +>t0_1 : Symbol(t0_1, Decl(main.ts, 60, 3)) >M : Symbol(M, Decl(main.ts, 1, 6)) >T0 : Symbol(T0, Decl(module.ts, 1, 20)) let t1_1: M.T1; ->t1_1 : Symbol(t1_1, Decl(main.ts, 68, 3)) +>t1_1 : Symbol(t1_1, Decl(main.ts, 61, 3)) >M : Symbol(M, Decl(main.ts, 1, 6)) >T1 : Symbol(T1, Decl(module.ts, 5, 1)) let t2_1: M.T2; ->t2_1 : Symbol(t2_1, Decl(main.ts, 69, 3)) +>t2_1 : Symbol(t2_1, Decl(main.ts, 62, 3)) >M : Symbol(M, Decl(main.ts, 1, 6)) >T2 : Symbol(T2, Decl(module.ts, 9, 1)) let t3_1: M.T3; ->t3_1 : Symbol(t3_1, Decl(main.ts, 70, 3)) +>t3_1 : Symbol(t3_1, Decl(main.ts, 63, 3)) >M : Symbol(M, Decl(main.ts, 1, 6)) >T3 : Symbol(T3, Decl(module.ts, 11, 1)) let t4: N.T4; ->t4 : Symbol(t4, Decl(main.ts, 71, 3)) +>t4 : Symbol(t4, Decl(main.ts, 64, 3)) >N : Symbol(N, Decl(main.ts, 1, 30)) >T4 : Symbol(N.T4, Decl(main.ts, 5, 24)) let t5: N.T5; ->t5 : Symbol(t5, Decl(main.ts, 72, 3)) +>t5 : Symbol(t5, Decl(main.ts, 65, 3)) >N : Symbol(N, Decl(main.ts, 1, 30)) >T5 : Symbol(N.T5, Decl(main.ts, 10, 5)) let t6: N.T6; ->t6 : Symbol(t6, Decl(main.ts, 73, 3)) +>t6 : Symbol(t6, Decl(main.ts, 66, 3)) >N : Symbol(N, Decl(main.ts, 1, 30)) >T6 : Symbol(N.T6, Decl(main.ts, 14, 5)) let t7: N.T7; ->t7 : Symbol(t7, Decl(main.ts, 74, 3)) +>t7 : Symbol(t7, Decl(main.ts, 67, 3)) >N : Symbol(N, Decl(main.ts, 1, 30)) >T7 : Symbol(N.T7, Decl(main.ts, 16, 5)) let t8: T8; ->t8 : Symbol(t8, Decl(main.ts, 75, 3)) ->T8 : Symbol(T8, Decl(main.ts, 25, 15)) +>t8 : Symbol(t8, Decl(main.ts, 68, 3)) +>T8 : Symbol(T8, Decl(main.ts, 24, 13)) let t9: T9; ->t9 : Symbol(t9, Decl(main.ts, 76, 3)) ->T9 : Symbol(T9, Decl(main.ts, 30, 1)) +>t9 : Symbol(t9, Decl(main.ts, 69, 3)) +>T9 : Symbol(T9, Decl(main.ts, 29, 1)) let t10: T10; ->t10 : Symbol(t10, Decl(main.ts, 77, 3)) ->T10 : Symbol(T10, Decl(main.ts, 34, 1)) +>t10 : Symbol(t10, Decl(main.ts, 70, 3)) +>T10 : Symbol(T10, Decl(main.ts, 33, 1)) let t11: T11; ->t11 : Symbol(t11, Decl(main.ts, 78, 3)) ->T11 : Symbol(T11, Decl(main.ts, 36, 1)) +>t11 : Symbol(t11, Decl(main.ts, 71, 3)) +>T11 : Symbol(T11, Decl(main.ts, 35, 1)) let t12: T12; ->t12 : Symbol(t12, Decl(main.ts, 79, 3)) ->T12 : Symbol(T12, Decl(main.ts, 40, 2)) +>t12 : Symbol(t12, Decl(main.ts, 72, 3)) +>T12 : Symbol(T12, Decl(main.ts, 39, 2)) let t13: T13; ->t13 : Symbol(t13, Decl(main.ts, 80, 3)) ->T13 : Symbol(T13, Decl(main.ts, 45, 1)) +>t13 : Symbol(t13, Decl(main.ts, 73, 3)) +>T13 : Symbol(T13, Decl(main.ts, 44, 1)) let t14: T14; ->t14 : Symbol(t14, Decl(main.ts, 81, 3)) ->T14 : Symbol(T14, Decl(main.ts, 49, 1)) +>t14 : Symbol(t14, Decl(main.ts, 74, 3)) +>T14 : Symbol(T14, Decl(main.ts, 48, 1)) let t15: T15; ->t15 : Symbol(t15, Decl(main.ts, 82, 3)) ->T15 : Symbol(T15, Decl(main.ts, 51, 1)) +>t15 : Symbol(t15, Decl(main.ts, 75, 3)) +>T15 : Symbol(T15, Decl(main.ts, 50, 1)) // assignability t0 = t1, t0 = t2, t0 = t3, t1 = t0, t1 = t2, t1 = t3, t2 = t0, t2 = t1, t2 = t3, t3 = t0, t3 = t1, t3 = t2; ->t0 : Symbol(t0, Decl(main.ts, 63, 3)) ->t1 : Symbol(t1, Decl(main.ts, 64, 3)) ->t0 : Symbol(t0, Decl(main.ts, 63, 3)) ->t2 : Symbol(t2, Decl(main.ts, 65, 3)) ->t0 : Symbol(t0, Decl(main.ts, 63, 3)) ->t3 : Symbol(t3, Decl(main.ts, 66, 3)) ->t1 : Symbol(t1, Decl(main.ts, 64, 3)) ->t0 : Symbol(t0, Decl(main.ts, 63, 3)) ->t1 : Symbol(t1, Decl(main.ts, 64, 3)) ->t2 : Symbol(t2, Decl(main.ts, 65, 3)) ->t1 : Symbol(t1, Decl(main.ts, 64, 3)) ->t3 : Symbol(t3, Decl(main.ts, 66, 3)) ->t2 : Symbol(t2, Decl(main.ts, 65, 3)) ->t0 : Symbol(t0, Decl(main.ts, 63, 3)) ->t2 : Symbol(t2, Decl(main.ts, 65, 3)) ->t1 : Symbol(t1, Decl(main.ts, 64, 3)) ->t2 : Symbol(t2, Decl(main.ts, 65, 3)) ->t3 : Symbol(t3, Decl(main.ts, 66, 3)) ->t3 : Symbol(t3, Decl(main.ts, 66, 3)) ->t0 : Symbol(t0, Decl(main.ts, 63, 3)) ->t3 : Symbol(t3, Decl(main.ts, 66, 3)) ->t1 : Symbol(t1, Decl(main.ts, 64, 3)) ->t3 : Symbol(t3, Decl(main.ts, 66, 3)) ->t2 : Symbol(t2, Decl(main.ts, 65, 3)) +>t0 : Symbol(t0, Decl(main.ts, 56, 3)) +>t1 : Symbol(t1, Decl(main.ts, 57, 3)) +>t0 : Symbol(t0, Decl(main.ts, 56, 3)) +>t2 : Symbol(t2, Decl(main.ts, 58, 3)) +>t0 : Symbol(t0, Decl(main.ts, 56, 3)) +>t3 : Symbol(t3, Decl(main.ts, 59, 3)) +>t1 : Symbol(t1, Decl(main.ts, 57, 3)) +>t0 : Symbol(t0, Decl(main.ts, 56, 3)) +>t1 : Symbol(t1, Decl(main.ts, 57, 3)) +>t2 : Symbol(t2, Decl(main.ts, 58, 3)) +>t1 : Symbol(t1, Decl(main.ts, 57, 3)) +>t3 : Symbol(t3, Decl(main.ts, 59, 3)) +>t2 : Symbol(t2, Decl(main.ts, 58, 3)) +>t0 : Symbol(t0, Decl(main.ts, 56, 3)) +>t2 : Symbol(t2, Decl(main.ts, 58, 3)) +>t1 : Symbol(t1, Decl(main.ts, 57, 3)) +>t2 : Symbol(t2, Decl(main.ts, 58, 3)) +>t3 : Symbol(t3, Decl(main.ts, 59, 3)) +>t3 : Symbol(t3, Decl(main.ts, 59, 3)) +>t0 : Symbol(t0, Decl(main.ts, 56, 3)) +>t3 : Symbol(t3, Decl(main.ts, 59, 3)) +>t1 : Symbol(t1, Decl(main.ts, 57, 3)) +>t3 : Symbol(t3, Decl(main.ts, 59, 3)) +>t2 : Symbol(t2, Decl(main.ts, 58, 3)) t4 = t5, t4 = t6, t4 = t7, t5 = t4, t5 = t6, t5 = t7, t6 = t4, t6 = t5, t6 = t7, t7 = t4, t7 = t5, t7 = t6; ->t4 : Symbol(t4, Decl(main.ts, 71, 3)) ->t5 : Symbol(t5, Decl(main.ts, 72, 3)) ->t4 : Symbol(t4, Decl(main.ts, 71, 3)) ->t6 : Symbol(t6, Decl(main.ts, 73, 3)) ->t4 : Symbol(t4, Decl(main.ts, 71, 3)) ->t7 : Symbol(t7, Decl(main.ts, 74, 3)) ->t5 : Symbol(t5, Decl(main.ts, 72, 3)) ->t4 : Symbol(t4, Decl(main.ts, 71, 3)) ->t5 : Symbol(t5, Decl(main.ts, 72, 3)) ->t6 : Symbol(t6, Decl(main.ts, 73, 3)) ->t5 : Symbol(t5, Decl(main.ts, 72, 3)) ->t7 : Symbol(t7, Decl(main.ts, 74, 3)) ->t6 : Symbol(t6, Decl(main.ts, 73, 3)) ->t4 : Symbol(t4, Decl(main.ts, 71, 3)) ->t6 : Symbol(t6, Decl(main.ts, 73, 3)) ->t5 : Symbol(t5, Decl(main.ts, 72, 3)) ->t6 : Symbol(t6, Decl(main.ts, 73, 3)) ->t7 : Symbol(t7, Decl(main.ts, 74, 3)) ->t7 : Symbol(t7, Decl(main.ts, 74, 3)) ->t4 : Symbol(t4, Decl(main.ts, 71, 3)) ->t7 : Symbol(t7, Decl(main.ts, 74, 3)) ->t5 : Symbol(t5, Decl(main.ts, 72, 3)) ->t7 : Symbol(t7, Decl(main.ts, 74, 3)) ->t6 : Symbol(t6, Decl(main.ts, 73, 3)) +>t4 : Symbol(t4, Decl(main.ts, 64, 3)) +>t5 : Symbol(t5, Decl(main.ts, 65, 3)) +>t4 : Symbol(t4, Decl(main.ts, 64, 3)) +>t6 : Symbol(t6, Decl(main.ts, 66, 3)) +>t4 : Symbol(t4, Decl(main.ts, 64, 3)) +>t7 : Symbol(t7, Decl(main.ts, 67, 3)) +>t5 : Symbol(t5, Decl(main.ts, 65, 3)) +>t4 : Symbol(t4, Decl(main.ts, 64, 3)) +>t5 : Symbol(t5, Decl(main.ts, 65, 3)) +>t6 : Symbol(t6, Decl(main.ts, 66, 3)) +>t5 : Symbol(t5, Decl(main.ts, 65, 3)) +>t7 : Symbol(t7, Decl(main.ts, 67, 3)) +>t6 : Symbol(t6, Decl(main.ts, 66, 3)) +>t4 : Symbol(t4, Decl(main.ts, 64, 3)) +>t6 : Symbol(t6, Decl(main.ts, 66, 3)) +>t5 : Symbol(t5, Decl(main.ts, 65, 3)) +>t6 : Symbol(t6, Decl(main.ts, 66, 3)) +>t7 : Symbol(t7, Decl(main.ts, 67, 3)) +>t7 : Symbol(t7, Decl(main.ts, 67, 3)) +>t4 : Symbol(t4, Decl(main.ts, 64, 3)) +>t7 : Symbol(t7, Decl(main.ts, 67, 3)) +>t5 : Symbol(t5, Decl(main.ts, 65, 3)) +>t7 : Symbol(t7, Decl(main.ts, 67, 3)) +>t6 : Symbol(t6, Decl(main.ts, 66, 3)) t0 = t12, t0 = t13, t0 = t14, t0 = t15, t12 = t0, t13 = t0, t14 = t0, t15 = t0; ->t0 : Symbol(t0, Decl(main.ts, 63, 3)) ->t12 : Symbol(t12, Decl(main.ts, 79, 3)) ->t0 : Symbol(t0, Decl(main.ts, 63, 3)) ->t13 : Symbol(t13, Decl(main.ts, 80, 3)) ->t0 : Symbol(t0, Decl(main.ts, 63, 3)) ->t14 : Symbol(t14, Decl(main.ts, 81, 3)) ->t0 : Symbol(t0, Decl(main.ts, 63, 3)) ->t15 : Symbol(t15, Decl(main.ts, 82, 3)) ->t12 : Symbol(t12, Decl(main.ts, 79, 3)) ->t0 : Symbol(t0, Decl(main.ts, 63, 3)) ->t13 : Symbol(t13, Decl(main.ts, 80, 3)) ->t0 : Symbol(t0, Decl(main.ts, 63, 3)) ->t14 : Symbol(t14, Decl(main.ts, 81, 3)) ->t0 : Symbol(t0, Decl(main.ts, 63, 3)) ->t15 : Symbol(t15, Decl(main.ts, 82, 3)) ->t0 : Symbol(t0, Decl(main.ts, 63, 3)) +>t0 : Symbol(t0, Decl(main.ts, 56, 3)) +>t12 : Symbol(t12, Decl(main.ts, 72, 3)) +>t0 : Symbol(t0, Decl(main.ts, 56, 3)) +>t13 : Symbol(t13, Decl(main.ts, 73, 3)) +>t0 : Symbol(t0, Decl(main.ts, 56, 3)) +>t14 : Symbol(t14, Decl(main.ts, 74, 3)) +>t0 : Symbol(t0, Decl(main.ts, 56, 3)) +>t15 : Symbol(t15, Decl(main.ts, 75, 3)) +>t12 : Symbol(t12, Decl(main.ts, 72, 3)) +>t0 : Symbol(t0, Decl(main.ts, 56, 3)) +>t13 : Symbol(t13, Decl(main.ts, 73, 3)) +>t0 : Symbol(t0, Decl(main.ts, 56, 3)) +>t14 : Symbol(t14, Decl(main.ts, 74, 3)) +>t0 : Symbol(t0, Decl(main.ts, 56, 3)) +>t15 : Symbol(t15, Decl(main.ts, 75, 3)) +>t0 : Symbol(t0, Decl(main.ts, 56, 3)) diff --git a/tests/baselines/reference/dynamicNames.types b/tests/baselines/reference/dynamicNames.types index 68c4026c35c..509b0a3f937 100644 --- a/tests/baselines/reference/dynamicNames.types +++ b/tests/baselines/reference/dynamicNames.types @@ -119,10 +119,6 @@ const c5 = 1; >c5 : 1 >1 : 1 -const c6 = "1"; ->c6 : "1" ->"1" : "1" - interface T8 { >T8 : T8 @@ -187,17 +183,6 @@ declare type T15 = { 1: string; }; -interface T16 { ->T16 : T16 - - [c5]: number; ->c5 : 1 - - [c6]: string; ->c6 : "1" -} - - let t0: T0; >t0 : T0 >T0 : T0 diff --git a/tests/baselines/reference/dynamicNamesErrors.errors.txt b/tests/baselines/reference/dynamicNamesErrors.errors.txt index 12796f95b99..50af0addb9a 100644 --- a/tests/baselines/reference/dynamicNamesErrors.errors.txt +++ b/tests/baselines/reference/dynamicNamesErrors.errors.txt @@ -1,14 +1,15 @@ tests/cases/compiler/dynamicNamesErrors.ts(5,5): error TS2300: Duplicate identifier '1'. tests/cases/compiler/dynamicNamesErrors.ts(6,5): error TS2300: Duplicate identifier '1'. -tests/cases/compiler/dynamicNamesErrors.ts(19,1): error TS2322: Type 'T2' is not assignable to type 'T1'. +tests/cases/compiler/dynamicNamesErrors.ts(19,5): error TS2711: Subsequent property declarations must have the same type. Property '[c1]' must be of type 'number', but here has type 'string'. +tests/cases/compiler/dynamicNamesErrors.ts(25,1): error TS2322: Type 'T2' is not assignable to type 'T1'. Types of property '1' are incompatible. Type 'string' is not assignable to type 'number'. -tests/cases/compiler/dynamicNamesErrors.ts(20,1): error TS2322: Type 'T1' is not assignable to type 'T2'. +tests/cases/compiler/dynamicNamesErrors.ts(26,1): error TS2322: Type 'T1' is not assignable to type 'T2'. Types of property '1' are incompatible. Type 'number' is not assignable to type 'string'. -==== tests/cases/compiler/dynamicNamesErrors.ts (4 errors) ==== +==== tests/cases/compiler/dynamicNamesErrors.ts (5 errors) ==== const c0 = "1"; const c1 = 1; @@ -29,6 +30,14 @@ tests/cases/compiler/dynamicNamesErrors.ts(20,1): error TS2322: Type 'T1' is not [c0]: string; } + interface T3 { + [c0]: number; + [c1]: string; + ~~~~ +!!! error TS2711: Subsequent property declarations must have the same type. Property '[c1]' must be of type 'number', but here has type 'string'. + } + + let t1: T1; let t2: T2; t1 = t2; diff --git a/tests/baselines/reference/dynamicNamesErrors.js b/tests/baselines/reference/dynamicNamesErrors.js index 960ad19db77..186ae8870d7 100644 --- a/tests/baselines/reference/dynamicNamesErrors.js +++ b/tests/baselines/reference/dynamicNamesErrors.js @@ -15,6 +15,12 @@ interface T2 { [c0]: string; } +interface T3 { + [c0]: number; + [c1]: string; +} + + let t1: T1; let t2: T2; t1 = t2; diff --git a/tests/cases/compiler/dynamicNames.ts b/tests/cases/compiler/dynamicNames.ts index 09255054d00..f99a49e975d 100644 --- a/tests/cases/compiler/dynamicNames.ts +++ b/tests/cases/compiler/dynamicNames.ts @@ -44,7 +44,6 @@ namespace N { const c4 = "a"; const c5 = 1; -const c6 = "1"; interface T8 { [c4]: number; @@ -76,12 +75,6 @@ declare type T15 = { 1: string; }; -interface T16 { - [c5]: number; - [c6]: string; -} - - let t0: T0; let t1: T1; let t2: T2; diff --git a/tests/cases/compiler/dynamicNamesErrors.ts b/tests/cases/compiler/dynamicNamesErrors.ts index f2c937cbdeb..c819619a581 100644 --- a/tests/cases/compiler/dynamicNamesErrors.ts +++ b/tests/cases/compiler/dynamicNamesErrors.ts @@ -16,6 +16,12 @@ interface T2 { [c0]: string; } +interface T3 { + [c0]: number; + [c1]: string; +} + + let t1: T1; let t2: T2; t1 = t2;