В чем разница между ?: и | undefined в TypeScript?

#typescript #optional #optional-parameters

#typescript #тип параметра #необязательно-параметры

Вопрос:

Мне интересно, есть ли разница (фактическая или рекомендуемая практика) между

 interface Fruit {
  cost?: number;
}
  

и

 interface Fruit {
  cost: number | undefined;
}
  

Если есть фактическая разница с точки зрения поведения, в чем она заключается?

Если нет, почему бы предпочесть | undefined или ?: (или наоборот)?

Отчасти сбит с толку, потому что я видел оба варианта и не уверен, есть ли на самом деле реальная причина для предпочтения одного над другим, или это просто сводится к предпочтению.

Спасибо!

Ответ №1:

Одно из отличий заключается в том, что свойство cost: number | undefined; должно существовать и иметь значение типа number or undefined . Напротив, cost?: number позволяет свойству вообще не существовать.

Не удается скомпилировать:

 interface Fruit {
    cost: number | undefined;
}
const x: Fruit = {};
  

Чтобы это сработало, вам нужно будет сделать:

 interface Fruit {
    cost: number | undefined;
}
const x: Fruit = { cost: undefined };
  

Но это удается:

 interface Fruit {
    cost?: number;
}
const x: Fruit = {};
  

Явный ввод undefined может быть утомительным, когда доступна альтернатива, поэтому вы, вероятно, предпочтете cost?: number вариант.

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

1. Вау, я, честно говоря, не знал — моим инстинктом всегда было предпочесть ?: | undefined , но я никогда не мог выразить это словами — никогда не думал экспериментировать. Это имеет смысл — спасибо за подробное объяснение!

2. Я просто немного поэкспериментировал, и это относится и к аргументам функции — какая интересная функция. Обязательно имейте это в виду. Еще раз спасибо!