首页 > 解决方案 > 任何人都可以澄清这个打字稿手册对“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

随着解释:

请注意,在此示例中,Mis string | number— 这是因为 JavaScript 对象键始终强制为 a 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);

(在Typescript Playground中测试)

标签: typescript

解决方案


我会根据有效转换来考虑它。

如果键被指定为number,则只允许数字,因为不是每个string都可以转换为数字。如果键被指定为string然而,那么number也变得有效,因为所有的数字都可以变成字符串,这就是在 JS 中隐式发生的事情。


推荐阅读