Skip to content

Commit 97b4063

Browse files
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 <[email protected]>
1 parent 4af8333 commit 97b4063

6 files changed

+80
-1
lines changed

src/compiler/checker.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11148,7 +11148,9 @@ namespace ts {
1114811148
prop.keyType = keyType;
1114911149
if (modifiersProp) {
1115011150
prop.syntheticOrigin = modifiersProp;
11151-
prop.declarations = modifiersProp.declarations;
11151+
// If the mapped type has an `as XXX` clause, the property name likely won't match the declaration name and
11152+
// multiple properties may map to the same name. Thus, we attach no declarations to the symbol.
11153+
prop.declarations = nameType ? undefined : modifiersProp.declarations;
1115211154
}
1115311155
members.set(propName, prop);
1115411156
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
tests/cases/compiler/mappedTypeAsStringTemplate.ts(7,5): error TS2345: Argument of type '{ x: number; }' is not assignable to parameter of type '{ xy: number; }'.
2+
Property 'xy' is missing in type '{ x: number; }' but required in type '{ xy: number; }'.
3+
4+
5+
==== tests/cases/compiler/mappedTypeAsStringTemplate.ts (1 errors) ====
6+
// Repro from #44220
7+
8+
function foo<T extends { [K in keyof T as `${Extract<K, string>}y`]: number }>(foox: T) { }
9+
10+
const c = { x: 1 };
11+
12+
foo(c);
13+
~
14+
!!! error TS2345: Argument of type '{ x: number; }' is not assignable to parameter of type '{ xy: number; }'.
15+
!!! error TS2345: Property 'xy' is missing in type '{ x: number; }' but required in type '{ xy: number; }'.
16+
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
//// [mappedTypeAsStringTemplate.ts]
2+
// Repro from #44220
3+
4+
function foo<T extends { [K in keyof T as `${Extract<K, string>}y`]: number }>(foox: T) { }
5+
6+
const c = { x: 1 };
7+
8+
foo(c);
9+
10+
11+
//// [mappedTypeAsStringTemplate.js]
12+
// Repro from #44220
13+
function foo(foox) { }
14+
var c = { x: 1 };
15+
foo(c);
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
=== tests/cases/compiler/mappedTypeAsStringTemplate.ts ===
2+
// Repro from #44220
3+
4+
function foo<T extends { [K in keyof T as `${Extract<K, string>}y`]: number }>(foox: T) { }
5+
>foo : Symbol(foo, Decl(mappedTypeAsStringTemplate.ts, 0, 0))
6+
>T : Symbol(T, Decl(mappedTypeAsStringTemplate.ts, 2, 13))
7+
>K : Symbol(K, Decl(mappedTypeAsStringTemplate.ts, 2, 26))
8+
>T : Symbol(T, Decl(mappedTypeAsStringTemplate.ts, 2, 13))
9+
>Extract : Symbol(Extract, Decl(lib.es5.d.ts, --, --))
10+
>K : Symbol(K, Decl(mappedTypeAsStringTemplate.ts, 2, 26))
11+
>foox : Symbol(foox, Decl(mappedTypeAsStringTemplate.ts, 2, 79))
12+
>T : Symbol(T, Decl(mappedTypeAsStringTemplate.ts, 2, 13))
13+
14+
const c = { x: 1 };
15+
>c : Symbol(c, Decl(mappedTypeAsStringTemplate.ts, 4, 5))
16+
>x : Symbol(x, Decl(mappedTypeAsStringTemplate.ts, 4, 11))
17+
18+
foo(c);
19+
>foo : Symbol(foo, Decl(mappedTypeAsStringTemplate.ts, 0, 0))
20+
>c : Symbol(c, Decl(mappedTypeAsStringTemplate.ts, 4, 5))
21+
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
=== tests/cases/compiler/mappedTypeAsStringTemplate.ts ===
2+
// Repro from #44220
3+
4+
function foo<T extends { [K in keyof T as `${Extract<K, string>}y`]: number }>(foox: T) { }
5+
>foo : <T extends { [K in keyof T as `${Extract<K, string>}y`]: number; }>(foox: T) => void
6+
>foox : T
7+
8+
const c = { x: 1 };
9+
>c : { x: number; }
10+
>{ x: 1 } : { x: number; }
11+
>x : number
12+
>1 : 1
13+
14+
foo(c);
15+
>foo(c) : void
16+
>foo : <T extends { [K in keyof T as `${Extract<K, string>}y`]: number; }>(foox: T) => void
17+
>c : { x: number; }
18+
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// Repro from #44220
2+
3+
function foo<T extends { [K in keyof T as `${Extract<K, string>}y`]: number }>(foox: T) { }
4+
5+
const c = { x: 1 };
6+
7+
foo(c);

0 commit comments

Comments
 (0)