Разница между объявлениями защиты типа и обнуляемым объектом в Typescript - PullRequest
0 голосов
/ 19 октября 2018

Недавно я нашел немного машинописного кода в большом угловом проекте, в котором в объявлении объекта был символ Bitwise-OR / Pipe-Symbol.Вот так:

dataSource: FileSource | null;

В моем понимании это объект типа FileSource , который также обнуляется .

dataSource = null; // Works
dataSource = new FileSource... // Works
dataSource = 32; // Error

Я также узнал, что вы можете объявить объект с полным набором типов данных следующим образом:

myVariable: number | string | null;

Теперь к моему актуальному вопросу: я также могу объявить объект с знак вопроса как символ для nullable.Есть ли какая-либо разница между этими двумя объявлениями?

myVariable: FileSource | null;
mySecondVariable?: FileSource;

Если между этими двумя нет различий, считаете ли вы это плохой практикой, поскольку это не распространено в других языках и не имеет допустимого кода javascript?

КСТАТИ: В Javascript это будет нормально:

myVariable: Number | null;
myVariable = "Hello World";

.

Мой фокус - обнуляемость объекта и отличие этих объявлений

Ответы [ 2 ]

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

Есть большая разница.Модификатор ? фактически эквивалентен | undefined.

Они полностью эквивалентны:

myVariable: FileSource | undefined;
mySecondVariable?: FileSource;
0 голосов
/ 19 октября 2018

Есть ли разница между этими двумя объявлениями?

Да, особенно со строгими проверками нуля .Свойство с типом объединения (символ |) должно присутствовать со значением, соответствующим одному из типов.

Необязательное свойство (объявлено с ?) это просто: Необязательно.Объект не обязан иметь его вообще.Несмотря на это, на данный момент (по крайней мере) TypeScript обрабатывает prop?: X точно так же, как prop: X | undefined;см. эту проблему , на которую указывают jcatz .

Без строгих нулевых проверок, это нормально:

type A = {
    dataSource: Date | null
};
type B = {
    dataSource?: Date
};

const a: A = { dataSource: null }; // Works
const b: B = { dataSource: null }; // Also works

С строгими нулевыми проверками, вторая неправильная:

type A = {
    dataSource: Date | null
};
type B = {
    dataSource?: Date
};

const a: A = { dataSource: null }; // Works
const b: B = { dataSource: null }; // Error: Type 'null' is not assignable to type 'Date | undefined'.

Живой пример на игровой площадке

Аналогично, назначение undefined будетвсе будет в порядке без строгих нулевых проверок, но с ними это ошибка в случае типа объединения:

type A = {
    dataSource: Date | null
};
type B = {
    dataSource?: Date
};

const a: A = { dataSource: undefined }; // Error: Type 'undefined' is not assignable to type 'Date | null'.
const b: B = { dataSource: undefined }; // Works

Пример Live на игровой площадке

...