Утверждение типа свойства при наличии другого свойства для объединенного типа

#typescript #discriminated-union #union-types

#typescript #различаемый-объединение #объединение-типы

Вопрос:

Можно ли утверждать тип свойства при существовании другого свойства?

Например:

 interface Base {
    field1: number;
}

interface Sub1 extends Base {
    field3: string;
    field2?: never;
}

interface Sub2 extends Base {
    field3: number;
    field2: string;
}

type Unionized = Sub1 | Sub2

function MyFunc(union: Unionized) {
    if (union.field2) {
        // expect union.field3 to be a number
        // But instead it is a union of string | number
        console.log(union.field3)
    }
}
  

Я ожидаю, что из приведенного выше кода, когда union.field2 он существует, union.field3 должен иметь тип number из Sub2 интерфейса, но он выводится как string | number .

Возможно ли это?

Правка 1: добавлен скриншот

объединение

Комментарии:

1. Основной подход заключается в объявлении общего поля как литерального в каждом отдельном типе и использовании его для этой цели.

2. Да, различаемые объединения. Мне было интересно, можно ли сделать нечто подобное при проверке существования другого свойства.

3. похоже, что ваш код ведет себя так, как вы ожидаете, в codesandbox

4. Какую версию TS вы используете? Для меня это работает так, как вы хотите, в TS 4.0, проверьте эту ссылку

5. В вашем случае объявленный field2 в Sub1 считается существующим независимо от его типа, даже если он набран как never . Я думаю, чтобы намекнуть TS о несуществующем свойстве, его следует удалить.