Доработка машинописного несвязного союза
Я пытаюсь заставить что-то вроде следующего работать, однако машинопись выдает ошибки при попытке доступа к o.foo
имущество:
type Base = { s: string };
type Extra = { foo: string; };
type Other = { bar: string; };
type T = Base & (Extra | Other);
function f(o: T): string {
if (typeof o.foo === 'string') {
return o.s + o.foo;
}
return o.s + o.bar;
}
Ошибка
Property 'foo' does not exist on type 'T'.
Property 'foo' does not exist on type 'Base & Other'.
Кажется, что машинопись не может правильно сделать вывод, что если o
имеет foo
свойство, то есть строка, то тип o
должен быть в Base & Extra
филиал союза.
Есть ли способ, чтобы это понять?
1 ответ
Решение
Вы не можете получить доступ к членам профсоюза, если они не являются общими. Вы можете использовать in
вместо этого наберите:
type Base = { s: string };
type Extra = { foo: string; };
type Other = { bar: string; };
type T = Base & (Extra | Other);
function f(o: T): string {
if ('foo' in o) {
return o.s + o.foo;
}
return o.s + o.bar;
}