Typescript 为什么'typeof Map2`返回'number'的提示?

Typescript 为什么'typeof Map2`返回'number'的提示?,typescript,Typescript,代码很简单。这是TS或VScode的错误吗 interface Map2<T> { [key: string]: T; } type XXX = keyof Map2<string> //hint~ type XXX = string | number 这不是虫子。这种行为是不公平的。从文件中: 给定对象类型X,X的keyof解析如下: 如果X包含字符串索引签名,则keyof X是字符串、数字和表示类似符号属性的文本类型的并集 之所以这样做是为了处理这样一

代码很简单。这是TS或VScode的错误吗

interface Map2<T> {
  [key: string]: T;
}
type XXX = keyof Map2<string>
     //hint~ type XXX = string | number

这不是虫子。这种行为是不公平的。从文件中:

给定对象类型X,X的keyof解析如下:

如果X包含字符串索引签名,则keyof X是字符串、数字和表示类似符号属性的文本类型的并集 之所以这样做是为了处理这样一个事实,即TypeScript有数字键的概念,尽管JavaScript实际上没有。但TypeScript假装数字是对象的有效键类型

JavaScript中的所有非符号键实际上都是数组的索引键。e、 例如,Object.keys[a,b]返回[0,1],当您用一个数字索引到一个数组中时,就像在arr[0]中一样,该索引是第一个,并且被视为arr[0]。因此,具有字符串索引的对象仍然可以被视为具有数字键的类似数组的对象,因为当您使用它们时,它们将被强制为字符串

在一个完全健全和理想的TypeScript类型系统中,会有一个名为的类型,它是字符串的子类型,对应于所有n的数值的Stringn的输出。当你们索引到一个对象时,TypeScript会自动将number强制为NumericString。在这个假设的世界中,字符串索引只是一个字符串索引,您仍然可以像数组一样使用它,并且没有任何人想要向keyof{[k:string]:any}添加数字的动机

然而,在这个世界中,数组在TypeScript中表示为具有数字键,如果您仅将字符串键视为非数字键,则会出现一个错误。你会得到{[n:number]:any}的键永远不会。他们没有通过删除数字索引并将其更改为NumericString来修复它,而是通过添加数字作为字符串的伪子类型来解决它,该字符串仅在查看对象键时出现

好了,给你。这是故意的。如果您不想在字符串中看到数字,可以使用建议的将keyof X替换为Extract

好吧,希望这会有帮助;祝你好运

interface Map2<T> {
  [key: string]: T;
}
type XXX = keyof Map2<boolean>
     //hint~ type XXX = string | number