Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Typescript不将对象键缩小为字符串_Typescript - Fatal编程技术网

为什么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
类型被编译器加宽了(尽管我告诉过它),并且不能在需要更窄的
字符串
类型的情况下使用。