Строка не может быть использована для индексации типа, даже если она строго типизирована - PullRequest
0 голосов
/ 19 апреля 2020

См. Пример:

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]
});

Детская площадка

Даже если указано, что объекты должны и могут только имеют указанные ключи из enum, при получении ключей объекта тип каждой клавиши просто string, а не Fruits. Почему это так? Я не могу думать ни о каких «червоточинах», как ключ объекта может отличаться от Fruits. Я имею в виду грязные вещи, такие как Object.defineProperty, или Object.assign, которые могут выполнить работу, и TypeScript не будет жаловаться на это, но он предназначен только для того, чтобы заботиться о типах, верно? Например, я мог бы исправить вышеуказанную проблему с помощью:

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

Но если я определю тип объектов, это должно изначально быть так?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...