Add a regression test for mapped type with as clause that bypassed interface extension check (#52070)

This commit is contained in:
Mateusz Burzyński authored and GitHub committed 2023-01-10 13:45:38 -08:00
1 parent 67cdaf9215
commit 48b6b8b1d9
5 files changed
+44 -1

No files matched your search

@@ -6,9 +6,10 @@ tests/cases/compiler/genericMappedTypeAsClause.ts(17,11): error TS2322: Type 'bo
tests/cases/compiler/genericMappedTypeAsClause.ts(18,34): error TS2322: Type '{ a: string; b: number; }' is not assignable to type 'MappedModel<T>'.
Object literal may only specify known properties, and 'a' does not exist in type 'MappedModel<T>'.
tests/cases/compiler/genericMappedTypeAsClause.ts(19,11): error TS2322: Type 'undefined' is not assignable to type 'MappedModel<T>'.
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.
==== tests/cases/compiler/genericMappedTypeAsClause.ts (7 errors) ====
==== tests/cases/compiler/genericMappedTypeAsClause.ts (8 errors) ====
type Model = {
a: string;
b: number;
@@ -45,4 +46,11 @@ tests/cases/compiler/genericMappedTypeAsClause.ts(19,11): error TS2322: Type 'un
~~
!!! error TS2322: Type 'undefined' is not assignable to type 'MappedModel<T>'.
}
// repro from #43189
type RemapRecord<K extends keyof any, V> = { [_ in never as K]: V }
interface RecordInterface2<K extends keyof any, V> extends RemapRecord<K, V> {} // should error
~~~~~~~~~~~~~~~~~
!!! error TS2312: An interface can only extend an object type or intersection of object types with statically known members.
@@ -19,6 +19,11 @@ function f1<T extends string>() {
const x5: MappedModel<T> = { a: 'bar', b: 42 }; // Error
const x6: MappedModel<T> = undefined; // Error
}
// repro from #43189
type RemapRecord<K extends keyof any, V> = { [_ in never as K]: V }
interface RecordInterface2<K extends keyof any, V> extends RemapRecord<K, V> {} // should error
//// [genericMappedTypeAsClause.js]
@@ -73,3 +73,21 @@ function f1<T extends string>() {
>undefined : Symbol(undefined)
}
// repro from #43189
type RemapRecord<K extends keyof any, V> = { [_ in never as K]: V }
>RemapRecord : Symbol(RemapRecord, Decl(genericMappedTypeAsClause.ts, 19, 1))
>K : Symbol(K, Decl(genericMappedTypeAsClause.ts, 23, 17))
>V : Symbol(V, Decl(genericMappedTypeAsClause.ts, 23, 37))
>_ : Symbol(_, Decl(genericMappedTypeAsClause.ts, 23, 46))
>K : Symbol(K, Decl(genericMappedTypeAsClause.ts, 23, 17))
>V : Symbol(V, Decl(genericMappedTypeAsClause.ts, 23, 37))
interface RecordInterface2<K extends keyof any, V> extends RemapRecord<K, V> {} // should error
>RecordInterface2 : Symbol(RecordInterface2, Decl(genericMappedTypeAsClause.ts, 23, 67))
>K : Symbol(K, Decl(genericMappedTypeAsClause.ts, 24, 27))
>V : Symbol(V, Decl(genericMappedTypeAsClause.ts, 24, 47))
>RemapRecord : Symbol(RemapRecord, Decl(genericMappedTypeAsClause.ts, 19, 1))
>K : Symbol(K, Decl(genericMappedTypeAsClause.ts, 24, 27))
>V : Symbol(V, Decl(genericMappedTypeAsClause.ts, 24, 47))
@@ -65,3 +65,10 @@ function f1<T extends string>() {
>undefined : undefined
}
// repro from #43189
type RemapRecord<K extends keyof any, V> = { [_ in never as K]: V }
>RemapRecord : RemapRecord<K, V>
interface RecordInterface2<K extends keyof any, V> extends RemapRecord<K, V> {} // should error
@@ -20,3 +20,8 @@ function f1<T extends string>() {
const x5: MappedModel<T> = { a: 'bar', b: 42 }; // Error
const x6: MappedModel<T> = undefined; // Error
}
// repro from #43189
type RemapRecord<K extends keyof any, V> = { [_ in never as K]: V }
interface RecordInterface2<K extends keyof any, V> extends RemapRecord<K, V> {} // should error