TypeScript не выполняет управления потоком анализа , просматривая типы объединения и следя за тем, чтобы каждый тип работал. Было бы неплохо, если бы это было так или вы могли бы сказать это сделать, и на самом деле я сделал предложение на этот счет, но в настоящее время это невозможно.
На данный момент единственный способ справиться с этим, о котором я знаю, - это обходные пути, о которых я упомянул в этом предложении: либо сделайте утверждение типа (что небезопасно), либо проведите компилятор через различные случаи (который является избыточным). Вот два разных способа:
Утверждение:
function buildBeast(animal: 'FISH' | 'BIRD' | 'ANT') {
const myBeast: Beast = animal === 'BIRD' ? {
type: animal,
flyingSpeed: 10
} : {type: animal} as Fish | Ant;
}
Пройдите компилятор по разным случаям:
function buildBeast(animal: 'FISH' | 'BIRD' | 'ANT') {
const myBeast: Beast = animal === 'BIRD' ? {
type: animal,
flyingSpeed: 10
} : (animal === 'FISH') ? {
type: animal
} : { type: animal };
}
Эй, если вы думаете, что TypeScript должен позволить вам распределить анализ потока управления по типам объединения, возможно, перейдите к этому предложению и дайте ему ? или опишите ваш вариант использования. Или, если указанные выше решения работают для вас, это тоже замечательно.
Надеюсь, это поможет. Удачи!