TypeScript: дискриминированный союз с пустым объектом - PullRequest
0 голосов
/ 08 октября 2018

У меня есть следующий тип User:

type User = {
    name: string;
    email: string;
} | {};

Таким образом, по сути, пользователь может быть объектом с именем и свойствами электронной почты или пустым объектом.

Когда я пытаюсьпроверяя , что из двух заданных объектов пользователя, TypeScript показывает ошибку.

if (user.name) { // ERROR
    // do something if user object is populated
}

В частности, приведенный выше код выдает ошибку:

Property 'url' does not exist on type 'PrismicImage'.
Property 'url' does not exist on type '{}'

Этовозможно ли иметь различенное объединение, где один из интерфейсов является пустым объектом?

1 Ответ

0 голосов
/ 08 октября 2018

Дискриминируемое объединение (как этот термин обычно понимается в TypeScript) - это объединение, в котором есть свойство дискриминанта , которое существует на каждом члене объединения с другим значением.Таким образом, союз, включающий {}, по определению не является дискриминационным союзом.Если вы хотите изменить свой дизайн, чтобы использовать различающееся объединение, все должно работать.

Относительно вашего текущего проекта: в общем случае тип объекта TypeScript включает любой объект, имеющий по крайней мере указанные свойства.Это означает, что {} фактически является типом любого объекта, а ваш тип User просто упрощается до {}.Не существует (разумного) способа выразить тип объекта без свойств; это предложение может добавить его.Вы должны будете привести свой объект, прежде чем сможете протестировать свойство name, и даже после того, как вы протестируете свойство, я не знаю ни одного способа, чтобы TypeScript автоматически узнал, что свойство email также существует.Вы могли бы по крайней мере определить определяемый пользователем тип защиты , чтобы скрыть весь беспорядок в одной функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...