вывод логического тега распознаваемого объединения завершается неудачно для «ложного» случая - PullRequest
0 голосов
/ 09 июля 2019

РЕДАКТИРОВАТЬ : Проблема заключалась в том, что просто не использовался строгий режим, который корректно запрещал типы со свойствами 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 - нет. «т.

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