谁能澄清一下 Typescript 手册中对“keyof”的解释吗?

Neu*_*ino 7 typescript

Typescript 手册中对索引签名的解释keyof毫无意义。

\n

从这里: https: //www.typescriptlang.org/docs/handbook/2/keyof-types.html

\n

给出以下示例:

\n
type 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

请注意,在此示例中,Mstring | number\xe2\x80\x94 这是因为 JavaScript 对象键始终被强制转换为string,因此obj[0]始终与 相同obj["0"]

\n
\n

这是没有意义的。

\n

类型的不同之处不是类型M的存在string,因为索引string首先被声明为,不同的是number解释中没有提到的类型的存在。

\n

此外,如果该类型string存在,因为“对象键始终强制为字符串”,那么为什么string不将其列为索引为A声明类型的类型的键类型之一number

\n

更新回应 H.Bs 的回答

\n

If the key is specified to be number, then only number is allowed because not every string can be converted to a number.

\n

但以下代码都会编译并运行,这表明使用 或 指定索引numberstringTypescript 和 Javascript 中都是有效的,无论索引访问类型的 Typescript 类型有何差异。

\n
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

H.B*_*.B. 1

我会从有效转换的角度来考虑它。

如果 key 指定为number,则只允许使用数字,因为不是每个都string可以转换为数字。string但是,如果将键指定为,则number也有效,因为所有数字都可以转换为字符串,这就是 JS 中隐式发生的情况。