即使强类型化,字符串也不能用于索引类型

时间:2020-04-18 21:38:13

标签: typescript

查看示例:

enum Fruits {
    Apple = 'apple',
    Banana = 'banana',
}

type FruitCounts = {
    [Fruits.Apple]: number;
    [Fruits.Banana]: string;
};

const lastCount: FruitCounts = {
    [Fruits.Apple]: 10,
    [Fruits.Banana]: '1.2kg'
};

const newCount: FruitCounts = {
    [Fruits.Apple]: 12,
    [Fruits.Banana]: '1.4kg'
};

const isTheSame = Object.keys(lastCount).every(fruit => {
    newCount[fruit] === lastCount[fruit]
});

Playground

即使指定了对象必须并且只能 具有枚举中指定的键,当获取对象的键时,每个键的类型只是string,而不是Fruits。为什么会这样呢?除了Fruits之外,我想不出任何“虫洞”。我的意思是像Object.definePropertyObject.assign这样肮脏的东西可以完成工作,而TypeScript不会抱怨它,但是它只在乎类型呢?例如,我可以使用以下方法解决上述问题:

const isTheSame = (Object.keys(Fruits) as Fruits[]).every(fruit => {
    newCount[fruit] === lastCount[fruit]
});

但是,如果我定义对象的类型,一开始应该是这样吗?

0 个答案:

没有答案