typescript - 任何人都可以澄清这个打字稿手册对“keyof”的解释吗?
问题描述
Typescript 手册中对索引签名的解释keyof
毫无意义。
从这里:https ://www.typescriptlang.org/docs/handbook/2/keyof-types.html
提供以下示例:
type Arrayish = { [n: number]: unknown };
type A = keyof Arrayish;
// type A = number
type Mapish = { [k: string]: boolean };
type M = keyof Mapish;
// type M = string | number
随着解释:
请注意,在此示例中,
M
isstring | number
— 这是因为 JavaScript 对象键始终强制为 astring
,因此obj[0]
始终与obj["0"]
.
这是没有意义的。
类型的不同M
之处不在于类型的存在string
,因为string
首先声明了索引,不同之处在于number
解释未解决的类型的存在。
此外,如果string
由于“对象键始终被强制转换为字符串”而存在该类型,那么为什么string
不将其列为A
索引为声明类型的类型的键类型之一number
?
更新响应 H.Bs 的回答
If 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 = {};
a1[0] = 4;
a1["2"] = 6; // Index declared as number but can be set with string.
console.log(a1);
let m1: Mapish = {};
m1[0] = true;
m1["2"] = false;
console.log(m1);
(在Typescript Playground中测试)
解决方案
我会根据有效转换来考虑它。
如果键被指定为number
,则只允许数字,因为不是每个string
都可以转换为数字。如果键被指定为string
然而,那么number
也变得有效,因为所有的数字都可以变成字符串,这就是在 JS 中隐式发生的事情。