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 75 76 77 78 79
|
=== tests/cases/compiler/inferenceShouldFailOnEvolvingArrays.ts ===
// repro from https://github.com/Microsoft/TypeScript/issues/25675
// The type of `arg` blocks inference but simplifies to T.
function logLength<T extends string, U extends string>(arg: { [K in U]: T }[U]): T {
>logLength : <T extends string, U extends string>(arg: { [K in U]: T; }[U]) => T
>arg : { [K in U]: T; }[U]
console.log(arg.length);
>console.log(arg.length) : void
>console.log : (...data: any[]) => void
>console : Console
>log : (...data: any[]) => void
>arg.length : number
>arg : { [K in U]: T; }[U]
>length : number
return arg;
>arg : { [K in U]: T; }[U]
}
logLength(42); // error
>logLength(42) : string
>logLength : <T extends string, U extends string>(arg: { [K in U]: T; }[U]) => T
>42 : 42
let z;
>z : any
z = logLength(42); // no error; T is inferred as `any`
>z = logLength(42) : string
>z : any
>logLength(42) : string
>logLength : <T extends string, U extends string>(arg: { [K in U]: T; }[U]) => T
>42 : 42
function logFirstLength<T extends string[], U extends string>(arg: { [K in U]: T }[U]): T {
>logFirstLength : <T extends string[], U extends string>(arg: { [K in U]: T; }[U]) => T
>arg : { [K in U]: T; }[U]
console.log(arg[0].length);
>console.log(arg[0].length) : void
>console.log : (...data: any[]) => void
>console : Console
>log : (...data: any[]) => void
>arg[0].length : number
>arg[0] : string
>arg : { [K in U]: T; }[U]
>0 : 0
>length : number
return arg;
>arg : { [K in U]: T; }[U]
}
logFirstLength([42]); // error
>logFirstLength([42]) : string[]
>logFirstLength : <T extends string[], U extends string>(arg: { [K in U]: T; }[U]) => T
>[42] : number[]
>42 : 42
let zz = [];
>zz : any[]
>[] : never[]
zz.push(logLength(42)); // no error; T is inferred as `any`
>zz.push(logLength(42)) : number
>zz.push : (...items: any[]) => number
>zz : any[]
>push : (...items: any[]) => number
>logLength(42) : string
>logLength : <T extends string, U extends string>(arg: { [K in U]: T; }[U]) => T
>42 : 42
zz = logFirstLength([42]); // no error; T is inferred as `any[]`
>zz = logFirstLength([42]) : string[]
>zz : any[]
>logFirstLength([42]) : string[]
>logFirstLength : <T extends string[], U extends string>(arg: { [K in U]: T; }[U]) => T
>[42] : number[]
>42 : 42
|