Я прочитал оператор '==' не может быть применен к типам x и y в Typescript 2, и это не было информативным для моего случая.
В TypeScript 2.5.3 мы определяем многие модели, используя строковые перечисления в форме:
export interface Event {
category: "MORNING" | "NIGHT";
enabled: boolean;
}
А затем примените к ним компараторы, например:
morning = events.filter(event => event.category === 'MORNING');
без жалоб.
Теперь в этом фрагменте кода:
if (event.enabled || event.category === 'MORNING') {
// something
}
else if (event.category !== 'MORNING') {
// something else
}
Я получаю ошибку компиляции Operator '!==' cannot be applied to types '"MORNING"' and '"NIGHT"'
в условии else if
, но не в условии if
, в котором используется тот же (но противоположный) компаратор.
Сокращая пример дальше, компилируется следующее:
if (event.category !== 'MORNING') {
// something
}
else if (event.category !== 'MORNING') {
// something else
}
И это компилируется:
if (event.category !== 'MORNING') {
// something
}
else if (event.category === 'MORNING') {
// something else
}
Принимая во внимание, что это выдает ошибку (в строке else if
):
if (event.category === 'MORNING') {
// something
}
else if (event.category !== 'MORNING') {
// something else
}
Какое фундаментальное свойство средства проверки типов я неправильно понял?
(Примечание: последние примеры сокращены из более сложных ситуаций, поэтому я не могу использовать простой else
.)
else if
не имеет смысла. Условиеif
равноevent.enabled || event.category === 'MORNING'
, поэтому по определению, если это условие не было истинным, то по определениюevent.category
равно'NIGHT'
, аevent.category !== 'MORNING'
истинно. Почему есть необходимость проверить это еще раз? Если это не точное представление условия, которое вам действительно нужно проверить, приведите пример, который является точным представлением этого условия. - person JLRishe   schedule 03.11.2017category
также более сложный, но при создании моего минимально воспроизводимого примера я заметил идентичное поведение с приведенный пример. Добавление настоящей стены кода не добавило бы ценности вопросу, поскольку я только хотел знать, почему существуют эти три последних случая. Ответ, который я благодарен за то, что вы предоставили, - это анализ типов на основе потока управления. :) - person msanford   schedule 06.11.2017