1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
|
=== tests/cases/compiler/genericMappedTypeAsClause.ts ===
type Model = {
>Model : { a: string; b: number; }
a: string;
>a : string
b: number;
>b : number
};
type MappedModel<Suffix extends string> = {
>MappedModel : MappedModel<Suffix>
[K in keyof Model as `${K}${Suffix}`]: Model[K];
};
const foo1: MappedModel<'Foo'> = { aFoo: 'test', bFoo: 42 };
>foo1 : MappedModel<"Foo">
>{ aFoo: 'test', bFoo: 42 } : { aFoo: string; bFoo: number; }
>aFoo : string
>'test' : "test"
>bFoo : number
>42 : 42
const foo2: MappedModel<'Foo'> = { bFoo: 'bar' }; // Error
>foo2 : MappedModel<"Foo">
>{ bFoo: 'bar' } : { bFoo: string; }
>bFoo : string
>'bar' : "bar"
function f1<T extends string>() {
>f1 : <T extends string>() => void
const x1: MappedModel<T> = 42; // Error
>x1 : MappedModel<T>
>42 : 42
const x2: MappedModel<T> = 'test'; // Error
>x2 : MappedModel<T>
>'test' : "test"
const x3: MappedModel<T> = [1, 2, 3]; // Error
>x3 : MappedModel<T>
>[1, 2, 3] : number[]
>1 : 1
>2 : 2
>3 : 3
const x4: MappedModel<T> = false; // Error
>x4 : MappedModel<T>
>false : false
const x5: MappedModel<T> = { a: 'bar', b: 42 }; // Error
>x5 : MappedModel<T>
>{ a: 'bar', b: 42 } : { a: string; b: number; }
>a : string
>'bar' : "bar"
>b : number
>42 : 42
const x6: MappedModel<T> = undefined; // Error
>x6 : MappedModel<T>
>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
|