From 64289f2b46305c593685516b95855fa2b8e64325 Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Tue, 15 Jun 2021 17:21:41 -0700 Subject: [PATCH 1/2] Don't attach declarations to symbols in mapped types with 'as XXX' clauses --- src/compiler/checker.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 533bedc70a1cd..e8eb960b245fb 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -11148,7 +11148,9 @@ namespace ts { prop.keyType = keyType; if (modifiersProp) { prop.syntheticOrigin = modifiersProp; - prop.declarations = modifiersProp.declarations; + // If the mapped type as an 'as XXX' clause, the property name likely won't match the declaration name and + // multiple properties may map to the same name. Thus, we attach no declarations to the symbol. + prop.declarations = nameType ? undefined : modifiersProp.declarations; } members.set(propName, prop); } From 4a4957615258a6df38ae241681643b82d953f415 Mon Sep 17 00:00:00 2001 From: Eli Barzilay Date: Tue, 15 Jun 2021 23:57:00 -0400 Subject: [PATCH 2/2] Add test (and tweak comment) --- src/compiler/checker.ts | 2 +- .../mappedTypeAsStringTemplate.errors.txt | 16 ++++++++++++++ .../reference/mappedTypeAsStringTemplate.js | 15 +++++++++++++ .../mappedTypeAsStringTemplate.symbols | 21 +++++++++++++++++++ .../mappedTypeAsStringTemplate.types | 18 ++++++++++++++++ .../compiler/mappedTypeAsStringTemplate.ts | 7 +++++++ 6 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/mappedTypeAsStringTemplate.errors.txt create mode 100644 tests/baselines/reference/mappedTypeAsStringTemplate.js create mode 100644 tests/baselines/reference/mappedTypeAsStringTemplate.symbols create mode 100644 tests/baselines/reference/mappedTypeAsStringTemplate.types create mode 100644 tests/cases/compiler/mappedTypeAsStringTemplate.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index e8eb960b245fb..cc2be4704b2ae 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -11148,7 +11148,7 @@ namespace ts { prop.keyType = keyType; if (modifiersProp) { prop.syntheticOrigin = modifiersProp; - // If the mapped type as an 'as XXX' clause, the property name likely won't match the declaration name and + // If the mapped type has an `as XXX` clause, the property name likely won't match the declaration name and // multiple properties may map to the same name. Thus, we attach no declarations to the symbol. prop.declarations = nameType ? undefined : modifiersProp.declarations; } diff --git a/tests/baselines/reference/mappedTypeAsStringTemplate.errors.txt b/tests/baselines/reference/mappedTypeAsStringTemplate.errors.txt new file mode 100644 index 0000000000000..ee08399cb6e49 --- /dev/null +++ b/tests/baselines/reference/mappedTypeAsStringTemplate.errors.txt @@ -0,0 +1,16 @@ +tests/cases/compiler/mappedTypeAsStringTemplate.ts(7,5): error TS2345: Argument of type '{ x: number; }' is not assignable to parameter of type '{ xy: number; }'. + Property 'xy' is missing in type '{ x: number; }' but required in type '{ xy: number; }'. + + +==== tests/cases/compiler/mappedTypeAsStringTemplate.ts (1 errors) ==== + // Repro from #44220 + + function foo}y`]: number }>(foox: T) { } + + const c = { x: 1 }; + + foo(c); + ~ +!!! error TS2345: Argument of type '{ x: number; }' is not assignable to parameter of type '{ xy: number; }'. +!!! error TS2345: Property 'xy' is missing in type '{ x: number; }' but required in type '{ xy: number; }'. + \ No newline at end of file diff --git a/tests/baselines/reference/mappedTypeAsStringTemplate.js b/tests/baselines/reference/mappedTypeAsStringTemplate.js new file mode 100644 index 0000000000000..8a461e835d7c2 --- /dev/null +++ b/tests/baselines/reference/mappedTypeAsStringTemplate.js @@ -0,0 +1,15 @@ +//// [mappedTypeAsStringTemplate.ts] +// Repro from #44220 + +function foo}y`]: number }>(foox: T) { } + +const c = { x: 1 }; + +foo(c); + + +//// [mappedTypeAsStringTemplate.js] +// Repro from #44220 +function foo(foox) { } +var c = { x: 1 }; +foo(c); diff --git a/tests/baselines/reference/mappedTypeAsStringTemplate.symbols b/tests/baselines/reference/mappedTypeAsStringTemplate.symbols new file mode 100644 index 0000000000000..4dd51efc28072 --- /dev/null +++ b/tests/baselines/reference/mappedTypeAsStringTemplate.symbols @@ -0,0 +1,21 @@ +=== tests/cases/compiler/mappedTypeAsStringTemplate.ts === +// Repro from #44220 + +function foo}y`]: number }>(foox: T) { } +>foo : Symbol(foo, Decl(mappedTypeAsStringTemplate.ts, 0, 0)) +>T : Symbol(T, Decl(mappedTypeAsStringTemplate.ts, 2, 13)) +>K : Symbol(K, Decl(mappedTypeAsStringTemplate.ts, 2, 26)) +>T : Symbol(T, Decl(mappedTypeAsStringTemplate.ts, 2, 13)) +>Extract : Symbol(Extract, Decl(lib.es5.d.ts, --, --)) +>K : Symbol(K, Decl(mappedTypeAsStringTemplate.ts, 2, 26)) +>foox : Symbol(foox, Decl(mappedTypeAsStringTemplate.ts, 2, 79)) +>T : Symbol(T, Decl(mappedTypeAsStringTemplate.ts, 2, 13)) + +const c = { x: 1 }; +>c : Symbol(c, Decl(mappedTypeAsStringTemplate.ts, 4, 5)) +>x : Symbol(x, Decl(mappedTypeAsStringTemplate.ts, 4, 11)) + +foo(c); +>foo : Symbol(foo, Decl(mappedTypeAsStringTemplate.ts, 0, 0)) +>c : Symbol(c, Decl(mappedTypeAsStringTemplate.ts, 4, 5)) + diff --git a/tests/baselines/reference/mappedTypeAsStringTemplate.types b/tests/baselines/reference/mappedTypeAsStringTemplate.types new file mode 100644 index 0000000000000..b4b7c5966b957 --- /dev/null +++ b/tests/baselines/reference/mappedTypeAsStringTemplate.types @@ -0,0 +1,18 @@ +=== tests/cases/compiler/mappedTypeAsStringTemplate.ts === +// Repro from #44220 + +function foo}y`]: number }>(foox: T) { } +>foo : }y`]: number; }>(foox: T) => void +>foox : T + +const c = { x: 1 }; +>c : { x: number; } +>{ x: 1 } : { x: number; } +>x : number +>1 : 1 + +foo(c); +>foo(c) : void +>foo : }y`]: number; }>(foox: T) => void +>c : { x: number; } + diff --git a/tests/cases/compiler/mappedTypeAsStringTemplate.ts b/tests/cases/compiler/mappedTypeAsStringTemplate.ts new file mode 100644 index 0000000000000..7c8bd44f0357d --- /dev/null +++ b/tests/cases/compiler/mappedTypeAsStringTemplate.ts @@ -0,0 +1,7 @@ +// Repro from #44220 + +function foo}y`]: number }>(foox: T) { } + +const c = { x: 1 }; + +foo(c);