interface PPP {
1: number
2: string
4: boolean
}
type Map1<T extends any[]> = {[K in keyof T]: T[K] extends keyof PPP ? PPP[T[K]] : never}
type Map2<T extends any[], U extends keyof T> = {[K in U]: T[K] extends keyof PPP ? PPP[T[K]] : never}
type Y1 = Map1<[1, 2]> // type Y1 = [number, string]
type Y2 = Map2<[1, 2], keyof [1, 2]> // type Y2 is not same as Y1
// type Y2 = {
// [x: number]: string | number;
// 0: number;
// 1: string;
// length: string;
// toString: never;
// toLocaleString: never;
// pop: never;
// push: never;
// concat: never;
// join: never;
// reverse: never;
// shift: never;
// slice: never;
// sort: never;
// ... 20 more ...;
// flat: never;
// }
As I know about TS, I would think Map1 is equivalent to Map2, however Y1 is not same as Y2, so there must be something that I don't know.
Question: what is the reason that causes this difference.