这些语句(接口与类型)之间有什么区别?
interface X {
a: number
b: string
}
type X = {
a: number
b: string
};
Run Code Online (Sandbox Code Playgroud) 我可以用对象类型表示法描述索引类型限制,如下所示:
enum Enum {
A = 0,
B = 1,
}
type EnumMap = {
[P in Enum]: string;
}
Run Code Online (Sandbox Code Playgroud)
但是,令人惊讶的是,在接口中使用索引符号时似乎不可能做到这一点:
enum Enum {
A = 0,
B = 1,
}
interface EnumMap {
[P in Enum]: string;
}
Run Code Online (Sandbox Code Playgroud)
错误是:
计算属性名称的类型必须为“字符串”、“数字”、“符号”或“任意”。
有什么原因吗?根据定义,TypeScript 中的枚举只能有字符串或数字值(甚至两者都有,但不推荐这样做),我认为枚举本身对于它列出的所有值都可以像联合类型一样工作。
进一步调查,我还发现,在下面的例子中,EnumValues有 type number, 而不是 (我期望的) 0 | 1。再次,为什么会这样?
const Enum = {
A: 0,
B: 1
};
type EnumKeys = keyof typeof Enum;
type EnumValues = typeof Enum[EnumKeys];
Run Code Online (Sandbox Code Playgroud)