【发布时间】:2021-10-05 22:54:54
【问题描述】:
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是string | number— 这是因为 JavaScript 对象键始终强制转换为string,因此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);
【问题讨论】:
-
我同意这种区别令人困惑。根据the mozilla docs on Array,数组索引似乎也在内部强制转换为 JS 中的字符串。 Nitpick:你能把标题当作一个问题吗?目前听起来像是一个错误报告。
-
这应该在 TypeScript 的仓库而不是 StackOverflow 上归档。只有他们有权对自己的文档进行更改。
-
@Terry 问题是现在每个开源项目都拒绝任何可能是支持请求的问题,而是将用户引导到 SO。同时 SO edgelords 投票关闭任何不是编码问题的东西。让普通用户在任何地方都想问一个简单的问题。
-
@Neutrino 这是真的。有时关于 SO 的问题可以在几秒钟内关闭:D 令人沮丧
标签: typescript