Typescript 手册中对索引签名的解释keyof
毫无意义。
从这里: https: //www.typescriptlang.org/docs/handbook/2/keyof-types.html
\n给出以下示例:
\ntype Arrayish = { [n: number]: unknown };\ntype A = keyof Arrayish;\n \n// type A = number\n \ntype Mapish = { [k: string]: boolean };\ntype M = keyof Mapish;\n \n// type M = string | number\n
Run Code Online (Sandbox Code Playgroud)\n随着解释:
\n\n\n请注意,在此示例中,
\nM
是string | number
\xe2\x80\x94 这是因为 JavaScript 对象键始终被强制转换为string
,因此obj[0]
始终与 相同obj["0"]
。
这是没有意义的。
\n类型的不同之处不是类型M
的存在string
,因为索引string
首先被声明为,不同的是number
解释中没有提到的类型的存在。
此外,如果该类型string
存在,因为“对象键始终强制为字符串”,那么为什么string
不将其列为索引为A
声明类型的类型的键类型之一number
?
更新回应 H.Bs 的回答
\nIf the key is specified to be number, then only number is allowed because not every string can be converted to a number.
但以下代码都会编译并运行,这表明使用 或 指定索引number
在string
Typescript 和 Javascript 中都是有效的,无论索引访问类型的 Typescript 类型有何差异。
let a1: Arrayish = {};\na1[0] = 4;\na1["2"] = 6; // Index declared as number but can be set with string.\nconsole.log(a1);\n\nlet m1: Mapish = {};\nm1[0] = true;\nm1["2"] = false;\nconsole.log(m1);\n
Run Code Online (Sandbox Code Playgroud)\n(在Typescript Playground中测试)
\n我会从有效转换的角度来考虑它。
如果 key 指定为number
,则只允许使用数字,因为不是每个都string
可以转换为数字。string
但是,如果将键指定为,则number
也有效,因为所有数字都可以转换为字符串,这就是 JS 中隐式发生的情况。
归档时间: |
|
查看次数: |
239 次 |
最近记录: |