Определение типа объекта по условию в TypeScript

Почему в функции test1 тип аргумента определяется правильно (когда сравнение происходит в конструкции if), но если сравнение вынести в переменную, то тип уже определить нельзя?

type A = {
    foo: 'type1',
    bar: 'bar',
} | {
    foo: 'type2',
    baz: 'baz',
}

function test1(arg: A) {
    if (arg.foo === 'type1') {
        console.log(arg.bar)
    } else {
        console.log(arg.baz)
    }
}

function test2(arg: A) {
    const isFirstType = arg.foo === 'type1';
    if (isFirstType) {
        console.log(arg.bar)
    } else {
        console.log(arg.baz)
    }
}

Я знаю, что можно написать функцию для проверки типа

type A = {
    foo: 'type1',
    bar: 'bar',
};

type B = {
    foo: 'type2',
    baz: 'baz',
}

type ArgType = A | B;

function isType1(obj: ArgType): obj is A {
    if (obj.foo === 'type1') {
        return true;
    }
    return false;
}

function test2(arg: ArgType) {
    if (isType1(arg)) {
        console.log(arg.bar)
    } else {
        console.log(arg.baz)
    }
}

Но меня интересует почему так работает, баг ли это тайпскрипта и есть ли issue на эту тему, а то я ничего не смог найти.


Ответы (0 шт):