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\nRun 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在stringTypescript 和 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);\nRun Code Online (Sandbox Code Playgroud)\n(在Typescript Playground中测试)
\n我会从有效转换的角度来考虑它。
如果 key 指定为number,则只允许使用数字,因为不是每个都string可以转换为数字。string但是,如果将键指定为,则number也有效,因为所有数字都可以转换为字符串,这就是 JS 中隐式发生的情况。
| 归档时间: |
|
| 查看次数: |
239 次 |
| 最近记录: |