РЕДАКТИРОВАТЬ : Проблема заключалась в том, что просто не использовался строгий режим, который корректно запрещал типы со свойствами null
и правильно выводил как истинные, так и ложные случаи.
Я пишу дискриминируемый союз, где тег является логическим значением, но попытка использовать !x.tag
в качестве охранника типов не работает. Я подозревал, что причина в том, что значение Falsey, такое как null
или undefined
, также будет учитываться, но определение типа тега как NonNullable<true>
и NonNullable<false>
не помогло - я все еще могу создать объект введите isTrue
или isFalse
с tag: null
. Это может привести к сбою охранника шрифта даже в истинном случае, поэтому я не понимаю, чего мне не хватает. Пример кода:
// definitions:
interface isTrue {
tag: NonNullable<true>;
data: string;
}
interface isFalse {
tag: NonNullable<false>;
data: number;
}
type either = isTrue | isFalse;
// playing around:
const falsy: isFalse = { tag: null, data: 5 }; // would expect this not to be ok but it is
const truthy: isTrue = { tag: null, data: 'a' }; // this is also allowed
decider({ tag: null, data: 4 }) // a legal call since the argument is valid as a isFalse object.
function decider(x: either) {
if (x.tag) { // inferred as isTrue
x.data
x.tag
} else { // still a union
x.data
x.tag
}
}
Я также пытался вставить !x.tag
в предложение if
и оставить дело true
в предложении else
, но в обоих случаях предложение true
выводится, а false
- нет. «т.