#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 о несуществующем свойстве, его следует удалить.