Определение типа объекта по условию в 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 на эту тему, а то я ничего не смог найти.