=== tests/cases/conformance/types/mapped/mappedTypeErrors.ts === interface Shape { name: string; >name : string width: number; >width : number height: number; >height : number visible: boolean; >visible : boolean } interface Named { name: string; >name : string } interface Point { x: number; >x : number y: number; >y : number } // Constraint checking type T00 = { [P in P]: string }; // Error >T00 : T00 type T01 = { [P in number]: string }; // Error >T01 : T01 type T02 = { [P in Date]: number }; // Error >T02 : T02 type T03 = Record; // Error >T03 : T03 type T10 = Pick; >T10 : T10 type T11 = Pick; // Error >T11 : T11 type T12 = Pick; // Error >T12 : T12 type T13 = Pick; >T13 : T13 type T14 = Pick; // Error >T14 : T14 type T15 = Pick; >T15 : T15 type T16 = Pick; // Error >T16 : T16 function f1(x: T) { >f1 : (x: T) => void >x : T let y: Pick; // Error >y : Pick } function f2(x: T) { >f2 : (x: T) => void >x : T let y: Pick; // Error >y : Pick } function f3(x: T) { >f3 : (x: T) => void >x : T let y: Pick; >y : Pick } function f4(x: T) { >f4 : (x: T) => void >x : T let y: Pick; >y : Pick } // Type identity checking function f10() { >f10 : () => void type K = keyof T; >K : keyof T var x: { [P in keyof T]: T[P] }; >x : { [P in keyof T]: T[P]; } var x: { [Q in keyof T]: T[Q] }; >x : { [P in keyof T]: T[P]; } var x: { [R in K]: T[R] }; >x : { [P in keyof T]: T[P]; } } function f11() { >f11 : () => void var x: { [P in keyof T]: T[P] }; >x : { [P in keyof T]: T[P]; } var x: { [P in keyof T]?: T[P] }; // Error >x : { [P in keyof T]: T[P]; } var x: { readonly [P in keyof T]: T[P] }; // Error >x : { [P in keyof T]: T[P]; } var x: { readonly [P in keyof T]?: T[P] }; // Error >x : { [P in keyof T]: T[P]; } } function f12() { >f12 : () => void var x: { [P in keyof T]: T[P] }; >x : { [P in keyof T]: T[P]; } var x: { [P in keyof T]: T[P][] }; // Error >x : { [P in keyof T]: T[P]; } } // Check that inferences to mapped types are secondary declare function objAndReadonly(primary: T, secondary: Readonly): T; >objAndReadonly : (primary: T, secondary: Readonly) => T >primary : T >secondary : Readonly declare function objAndPartial(primary: T, secondary: Partial): T; >objAndPartial : (primary: T, secondary: Partial) => T >primary : T >secondary : Partial function f20() { >f20 : () => void let x1 = objAndReadonly({ x: 0, y: 0 }, { x: 1 }); // Error >x1 : { x: number; y: number; } >objAndReadonly({ x: 0, y: 0 }, { x: 1 }) : { x: number; y: number; } >objAndReadonly : (primary: T, secondary: Readonly) => T >{ x: 0, y: 0 } : { x: number; y: number; } >x : number >0 : 0 >y : number >0 : 0 >{ x: 1 } : { x: number; } >x : number >1 : 1 let x2 = objAndReadonly({ x: 0, y: 0 }, { x: 1, y: 1 }); >x2 : { x: number; y: number; } >objAndReadonly({ x: 0, y: 0 }, { x: 1, y: 1 }) : { x: number; y: number; } >objAndReadonly : (primary: T, secondary: Readonly) => T >{ x: 0, y: 0 } : { x: number; y: number; } >x : number >0 : 0 >y : number >0 : 0 >{ x: 1, y: 1 } : { x: number; y: number; } >x : number >1 : 1 >y : number >1 : 1 let x3 = objAndReadonly({ x: 0, y: 0 }, { x: 1, y: 1, z: 1 }); // Error >x3 : { x: number; y: number; } >objAndReadonly({ x: 0, y: 0 }, { x: 1, y: 1, z: 1 }) : { x: number; y: number; } >objAndReadonly : (primary: T, secondary: Readonly) => T >{ x: 0, y: 0 } : { x: number; y: number; } >x : number >0 : 0 >y : number >0 : 0 >{ x: 1, y: 1, z: 1 } : { x: number; y: number; z: number; } >x : number >1 : 1 >y : number >1 : 1 >z : number >1 : 1 } function f21() { >f21 : () => void let x1 = objAndPartial({ x: 0, y: 0 }, { x: 1 }); >x1 : { x: number; y: number; } >objAndPartial({ x: 0, y: 0 }, { x: 1 }) : { x: number; y: number; } >objAndPartial : (primary: T, secondary: Partial) => T >{ x: 0, y: 0 } : { x: number; y: number; } >x : number >0 : 0 >y : number >0 : 0 >{ x: 1 } : { x: number; } >x : number >1 : 1 let x2 = objAndPartial({ x: 0, y: 0 }, { x: 1, y: 1 }); >x2 : { x: number; y: number; } >objAndPartial({ x: 0, y: 0 }, { x: 1, y: 1 }) : { x: number; y: number; } >objAndPartial : (primary: T, secondary: Partial) => T >{ x: 0, y: 0 } : { x: number; y: number; } >x : number >0 : 0 >y : number >0 : 0 >{ x: 1, y: 1 } : { x: number; y: number; } >x : number >1 : 1 >y : number >1 : 1 let x3 = objAndPartial({ x: 0, y: 0 }, { x: 1, y: 1, z: 1 }); // Error >x3 : { x: number; y: number; } >objAndPartial({ x: 0, y: 0 }, { x: 1, y: 1, z: 1 }) : { x: number; y: number; } >objAndPartial : (primary: T, secondary: Partial) => T >{ x: 0, y: 0 } : { x: number; y: number; } >x : number >0 : 0 >y : number >0 : 0 >{ x: 1, y: 1, z: 1 } : { x: number; y: number; z: number; } >x : number >1 : 1 >y : number >1 : 1 >z : number >1 : 1 } // Verify use of Pick for setState functions (#12793) interface Foo { a: string; >a : string b?: number; >b : number | undefined } function setState(obj: T, props: Pick) { >setState : (obj: T, props: Pick) => void >obj : T >props : Pick for (let k in props) { >k : Extract >props : Pick obj[k] = props[k]; >obj[k] = props[k] : Pick[Extract] >obj[k] : T[Extract] >obj : T >k : Extract >props[k] : Pick[Extract] >props : Pick >k : Extract } } let foo: Foo = { a: "hello", b: 42 }; >foo : Foo >{ a: "hello", b: 42 } : { a: string; b: number; } >a : string >"hello" : "hello" >b : number >42 : 42 setState(foo, { a: "test", b: 43 }) >setState(foo, { a: "test", b: 43 }) : void >setState : (obj: T, props: Pick) => void >foo : Foo >{ a: "test", b: 43 } : { a: string; b: number; } >a : string >"test" : "test" >b : number >43 : 43 setState(foo, { a: "hi" }); >setState(foo, { a: "hi" }) : void >setState : (obj: T, props: Pick) => void >foo : Foo >{ a: "hi" } : { a: string; } >a : string >"hi" : "hi" setState(foo, { b: undefined }); >setState(foo, { b: undefined }) : void >setState : (obj: T, props: Pick) => void >foo : Foo >{ b: undefined } : { b: undefined; } >b : undefined >undefined : undefined setState(foo, { }); >setState(foo, { }) : void >setState : (obj: T, props: Pick) => void >foo : Foo >{ } : {} setState(foo, foo); >setState(foo, foo) : void >setState : (obj: T, props: Pick) => void >foo : Foo >foo : Foo setState(foo, { a: undefined }); // Error >setState(foo, { a: undefined }) : void >setState : (obj: T, props: Pick) => void >foo : Foo >{ a: undefined } : { a: undefined; } >a : undefined >undefined : undefined setState(foo, { c: true }); // Error >setState(foo, { c: true }) : void >setState : (obj: T, props: Pick) => void >foo : Foo >{ c: true } : { c: boolean; } >c : boolean >true : true class C { >C : C state: T; >state : T setState(props: Pick) { >setState : (props: Pick) => void >props : Pick for (let k in props) { >k : Extract >props : Pick this.state[k] = props[k]; >this.state[k] = props[k] : Pick[Extract] >this.state[k] : T[Extract] >this.state : T >this : this >state : T >k : Extract >props[k] : Pick[Extract] >props : Pick >k : Extract } } } let c = new C(); >c : C >new C() : C >C : typeof C c.setState({ a: "test", b: 43 }); >c.setState({ a: "test", b: 43 }) : void >c.setState : (props: Pick) => void >c : C >setState : (props: Pick) => void >{ a: "test", b: 43 } : { a: string; b: number; } >a : string >"test" : "test" >b : number >43 : 43 c.setState({ a: "hi" }); >c.setState({ a: "hi" }) : void >c.setState : (props: Pick) => void >c : C >setState : (props: Pick) => void >{ a: "hi" } : { a: string; } >a : string >"hi" : "hi" c.setState({ b: undefined }); >c.setState({ b: undefined }) : void >c.setState : (props: Pick) => void >c : C >setState : (props: Pick) => void >{ b: undefined } : { b: undefined; } >b : undefined >undefined : undefined c.setState({ }); >c.setState({ }) : void >c.setState : (props: Pick) => void >c : C >setState : (props: Pick) => void >{ } : {} c.setState(foo); >c.setState(foo) : void >c.setState : (props: Pick) => void >c : C >setState : (props: Pick) => void >foo : Foo c.setState({ a: undefined }); // Error >c.setState({ a: undefined }) : void >c.setState : (props: Pick) => void >c : C >setState : (props: Pick) => void >{ a: undefined } : { a: undefined; } >a : undefined >undefined : undefined c.setState({ c: true }); // Error >c.setState({ c: true }) : void >c.setState : (props: Pick) => void >c : C >setState : (props: Pick) => void >{ c: true } : { c: boolean; } >c : boolean >true : true type T2 = { a?: number, [key: string]: any }; >T2 : T2 >a : number | undefined >key : string let x1: T2 = { a: 'no' }; // Error >x1 : T2 >{ a: 'no' } : { a: string; } >a : string >'no' : "no" let x2: Partial = { a: 'no' }; // Error >x2 : Partial >{ a: 'no' } : { a: string; } >a : string >'no' : "no" let x3: { [P in keyof T2]: T2[P]} = { a: 'no' }; // Error >x3 : { [x: string]: any; a?: number | undefined; } >{ a: 'no' } : { a: string; } >a : string >'no' : "no" // Repro from #13044 type Foo2 = { >Foo2 : Foo2 pf: {[P in F]?: T[P]}, >pf : { [P in F]?: T[P] | undefined; } pt: {[P in T]?: T[P]}, // note: should be in keyof T >pt : { [P in T]?: T[P] | undefined; } }; type O = {x: number, y: boolean}; >O : O >x : number >y : boolean let o: O = {x: 5, y: false}; >o : O >{x: 5, y: false} : { x: number; y: false; } >x : number >5 : 5 >y : false >false : false let f: Foo2 = { >f : Foo2 >{ pf: {x: 7}, pt: {x: 7, y: false},} : { pf: { x: number; }; pt: { x: number; y: boolean; }; } pf: {x: 7}, >pf : { x: number; } >{x: 7} : { x: number; } >x : number >7 : 7 pt: {x: 7, y: false}, >pt : { x: number; y: boolean; } >{x: 7, y: false} : { x: number; y: boolean; } >x : number >7 : 7 >y : boolean >false : false }; // Repro from #28170 function test1(obj: Pick) { >test1 : (obj: Pick) => void >obj : Pick let x = obj.foo; // Error >x : any >obj.foo : any >obj : Pick >foo : any } function test2(obj: Record) { >test2 : (obj: Record) => void >obj : Record let x = obj.foo; // Error >x : any >obj.foo : any >obj : Record >foo : any }