Arrays 为什么允许在映射对象中索引具有无效键的数组

Arrays 为什么允许在映射对象中索引具有无效键的数组,arrays,typescript,generics,tuples,mapped-types,Arrays,Typescript,Generics,Tuples,Mapped Types,在typescript中,编译器允许我们对具有无效键的元组进行索引,从而推断未知为无效字符串键,推断未定义为无效数字键。当使用像Promisetsc这样的对象进行索引时,tsc会推断出空对象 type Foo<T extends any[]> = { [K in T[number]] : T[K] } /* type x = { 4: undefined; toString: () => string; abcd: unknown;

在typescript中,编译器允许我们对具有无效键的元组进行索引,从而推断
未知
为无效字符串键,推断
未定义
为无效数字键。当使用像
Promise
tsc这样的对象进行索引时,tsc会推断出空对象

type Foo<T extends any[]> = {
  [K in T[number]] : T[K]
}

/*
  type x = {
      4: undefined;
      toString: () => string;
      abcd: unknown;
      1: "abcd";
  }
*/
type x = Foo<['toString', 'abcd', 1, 4]>
/*
  type y = {
    [x: string]: unknown;
  }
*/
type y = Foo<[string]>
/*
  type z = {
    [x: number]: number;
  }
*/
type z = Foo<[number]>
/*
  type l = {}
*/
type l = Foo<[symbol]>
/*
  type f = {}
*/
type f = Foo<[Promise<number>]>
类型Foo={
[K in T[number]]:T[K]
}
/*
x型={
4:未定义;
toString:()=>字符串;
abcd:未知;
1:“abcd”;
}
*/
类型x=Foo
/*
y型={
[x:字符串]:未知;
}
*/
类型y=Foo
/*
类型z={
[x:编号]:编号;
}
*/
类型z=Foo
/*
类型l={}
*/
类型l=Foo
/*
类型f={}
*/
类型f=Foo
为什么允许这样做?为什么删除
会扩展任何[]
绑定会产生编译错误,我希望在不删除它的情况下看到编译错误