为什么Typescript不将对象键缩小为字符串
如果我定义这样的类型:为什么Typescript不将对象键缩小为字符串,typescript,Typescript,如果我定义这样的类型: type O = { [k: string]: any }; 我希望O中的键会缩小为string类型。但是,如果我定义: type KO = keyof O; KO计算结果为string | number。为什么会这样?在我对O的定义中,我不是明确地将O的键缩小为string吗?我在O的定义中声明了[k:string],如果你有string索引,你会自动获得编号索引器,以及: 如果您有一个带有字符串索引签名的类型,keyof T将是string | number(而不
type O = { [k: string]: any };
我希望O
中的键会缩小为string
类型。但是,如果我定义:
type KO = keyof O;
KO
计算结果为string | number
。为什么会这样?在我对O
的定义中,我不是明确地将O
的键缩小为string
吗?我在O
的定义中声明了[k:string]
,如果你有string
索引,你会自动获得编号
索引器,以及:
如果您有一个带有字符串
索引签名的类型,keyof T
将是string | number
(而不仅仅是string,因为在JavaScript中,您可以使用字符串
(对象['42']
)或数字
(对象[42]
)访问对象属性)
我想我是糊涂了。我知道Javascript允许数字和字符串作为索引器,但添加类型系统来指定和强制约束的目的不是吗?Javascript不断地试图将对象强制为字符串,但这并不是让Typescript将
|string
隐式附加到原语的理由。@Mattia我认为这里的要点是对象['42']
和对象[42]
引用对象中的相同位置,两者之间没有区别。因此,如果您有一个带有字符串索引器的对象,则始终可以使用包含数字的字符串值。。那么为什么不允许数字按原样使用呢?不允许的一个原因是KO
类型被编译器加宽了(尽管我告诉过它),并且不能在需要更窄的字符串
类型的情况下使用。