Skip to content

Commit 48b6b8b

Browse files
authored
Add a regression test for mapped type with as clause that bypassed interface extension check (#52070)
1 parent 67cdaf9 commit 48b6b8b

File tree

5 files changed

+44
-1
lines changed

5 files changed

+44
-1
lines changed

tests/baselines/reference/genericMappedTypeAsClause.errors.txt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,10 @@ tests/cases/compiler/genericMappedTypeAsClause.ts(17,11): error TS2322: Type 'bo
66
tests/cases/compiler/genericMappedTypeAsClause.ts(18,34): error TS2322: Type '{ a: string; b: number; }' is not assignable to type 'MappedModel<T>'.
77
Object literal may only specify known properties, and 'a' does not exist in type 'MappedModel<T>'.
88
tests/cases/compiler/genericMappedTypeAsClause.ts(19,11): error TS2322: Type 'undefined' is not assignable to type 'MappedModel<T>'.
9+
tests/cases/compiler/genericMappedTypeAsClause.ts(25,60): error TS2312: An interface can only extend an object type or intersection of object types with statically known members.
910

1011

11-
==== tests/cases/compiler/genericMappedTypeAsClause.ts (7 errors) ====
12+
==== tests/cases/compiler/genericMappedTypeAsClause.ts (8 errors) ====
1213
type Model = {
1314
a: string;
1415
b: number;
@@ -45,4 +46,11 @@ tests/cases/compiler/genericMappedTypeAsClause.ts(19,11): error TS2322: Type 'un
4546
~~
4647
!!! error TS2322: Type 'undefined' is not assignable to type 'MappedModel<T>'.
4748
}
49+
50+
// repro from #43189
51+
52+
type RemapRecord<K extends keyof any, V> = { [_ in never as K]: V }
53+
interface RecordInterface2<K extends keyof any, V> extends RemapRecord<K, V> {} // should error
54+
~~~~~~~~~~~~~~~~~
55+
!!! error TS2312: An interface can only extend an object type or intersection of object types with statically known members.
4856

tests/baselines/reference/genericMappedTypeAsClause.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@ function f1<T extends string>() {
1919
const x5: MappedModel<T> = { a: 'bar', b: 42 }; // Error
2020
const x6: MappedModel<T> = undefined; // Error
2121
}
22+
23+
// repro from #43189
24+
25+
type RemapRecord<K extends keyof any, V> = { [_ in never as K]: V }
26+
interface RecordInterface2<K extends keyof any, V> extends RemapRecord<K, V> {} // should error
2227

2328

2429
//// [genericMappedTypeAsClause.js]

tests/baselines/reference/genericMappedTypeAsClause.symbols

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,3 +73,21 @@ function f1<T extends string>() {
7373
>undefined : Symbol(undefined)
7474
}
7575

76+
// repro from #43189
77+
78+
type RemapRecord<K extends keyof any, V> = { [_ in never as K]: V }
79+
>RemapRecord : Symbol(RemapRecord, Decl(genericMappedTypeAsClause.ts, 19, 1))
80+
>K : Symbol(K, Decl(genericMappedTypeAsClause.ts, 23, 17))
81+
>V : Symbol(V, Decl(genericMappedTypeAsClause.ts, 23, 37))
82+
>_ : Symbol(_, Decl(genericMappedTypeAsClause.ts, 23, 46))
83+
>K : Symbol(K, Decl(genericMappedTypeAsClause.ts, 23, 17))
84+
>V : Symbol(V, Decl(genericMappedTypeAsClause.ts, 23, 37))
85+
86+
interface RecordInterface2<K extends keyof any, V> extends RemapRecord<K, V> {} // should error
87+
>RecordInterface2 : Symbol(RecordInterface2, Decl(genericMappedTypeAsClause.ts, 23, 67))
88+
>K : Symbol(K, Decl(genericMappedTypeAsClause.ts, 24, 27))
89+
>V : Symbol(V, Decl(genericMappedTypeAsClause.ts, 24, 47))
90+
>RemapRecord : Symbol(RemapRecord, Decl(genericMappedTypeAsClause.ts, 19, 1))
91+
>K : Symbol(K, Decl(genericMappedTypeAsClause.ts, 24, 27))
92+
>V : Symbol(V, Decl(genericMappedTypeAsClause.ts, 24, 47))
93+

tests/baselines/reference/genericMappedTypeAsClause.types

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,3 +65,10 @@ function f1<T extends string>() {
6565
>undefined : undefined
6666
}
6767

68+
// repro from #43189
69+
70+
type RemapRecord<K extends keyof any, V> = { [_ in never as K]: V }
71+
>RemapRecord : RemapRecord<K, V>
72+
73+
interface RecordInterface2<K extends keyof any, V> extends RemapRecord<K, V> {} // should error
74+

tests/cases/compiler/genericMappedTypeAsClause.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,8 @@ function f1<T extends string>() {
2020
const x5: MappedModel<T> = { a: 'bar', b: 42 }; // Error
2121
const x6: MappedModel<T> = undefined; // Error
2222
}
23+
24+
// repro from #43189
25+
26+
type RemapRecord<K extends keyof any, V> = { [_ in never as K]: V }
27+
interface RecordInterface2<K extends keyof any, V> extends RemapRecord<K, V> {} // should error

0 commit comments

Comments
 (0)