Доработка машинописного несвязного союза - PullRequest
0 голосов
/ 27 февраля 2019

Я пытаюсь заставить работать что-то вроде следующего, однако машинопись выдает ошибки при попытке получить доступ к свойству 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 Ответ

0 голосов
/ 27 февраля 2019

Вы не можете получить доступ к членам профсоюза, если они не являются общими.Вместо этого вы можете использовать in typeguard:

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;
}
...