From 97b4063d73d479053ba98e7f12744b46db04cfd8 Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Wed, 16 Jun 2021 16:07:33 -0700 Subject: [PATCH] Don't attach declarations to symbols in mapped types with 'as XXX' clauses (#44609) * Don't attach declarations to symbols in mapped types with 'as XXX' clauses * Add test (and tweak comment) Co-authored-by: Eli Barzilay --- src/compiler/checker.ts | 4 +++- .../mappedTypeAsStringTemplate.errors.txt | 16 ++++++++++++++ .../reference/mappedTypeAsStringTemplate.js | 15 +++++++++++++ .../mappedTypeAsStringTemplate.symbols | 21 +++++++++++++++++++ .../mappedTypeAsStringTemplate.types | 18 ++++++++++++++++ .../compiler/mappedTypeAsStringTemplate.ts | 7 +++++++ 6 files changed, 80 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 9f82b5b1111..e763d5703fc 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 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; } members.set(propName, prop); } diff --git a/tests/baselines/reference/mappedTypeAsStringTemplate.errors.txt b/tests/baselines/reference/mappedTypeAsStringTemplate.errors.txt new file mode 100644 index 00000000000..ee08399cb6e --- /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 00000000000..8a461e835d7 --- /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 00000000000..4dd51efc280 --- /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 00000000000..b4b7c5966b9 --- /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 00000000000..7c8bd44f035 --- /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);