Согласно Эта статья, когда в TypeScript включена строгая проверка на нуль, вы не можете присваивать null
или undefined
переменной, если это явно не разрешено объединением.
// required value
let req: string;
req = "Something"; // OK
req = null; // Error
req = undefined; // Error
// nullable value
let nbl: string | null;
nbl = "Something"; // OK
nbl = null; // OK
nbl = undefined; // Error
Но разрешено ли null
в значении необязательный в TypeScript?
// optional value
let opt?: string; // (actually invalid, as optional types cannot be used for variable declarations, but that's not the point, so imagine we are dealing with function parameters or something)
opt = "Something"; // OK
opt = null; // OK? Error?
opt = undefined; // OK
Или
opt?: string;
эквивалентно
opt: string | undefined;
таким образом, не разрешая null
, как рекомендовано Рекомендации Microsoft по написанию кода?
let d?: string;
объявляет тип как string | undefined
.
Это связано с тем, что undefined
является значением по умолчанию для переменных JS.
Обновлено: Важная заметка Как отметил Квентин С в комментарии ниже, перечисленное здесь поведение возможно только при включенной строгой проверке нулевого значения: "strictNullChecks": true
в tsconfig.json
.
Типы null
и undefined
обрабатываются как отдельные типы. Тип необязательный является особым, он также позволяет исключить аргументы из вызовов функций.
1. Без союза или опциона ничего кроме самого типа не допускается.
function foo(bar: string) {
console.info(bar);
}
foo("Hello World!"); // OK
foo(null); // Error
foo(undefined); // Error
foo() // Error
2. Чтобы дополнительно разрешить null
, можно сделать союз с null
.
function foo(bar: string | null) {
console.info(bar);
}
foo("Hello World!"); // OK
foo(null); // OK
foo(undefined); // Error
foo() // Error
3. Разрешение undefined
работает аналогично. Обратите внимание, что аргумент нельзя опустить или null
.
function foo(bar: string | undefined) {
console.info(bar);
}
foo("Hello World!"); // OK
foo(null); // Error
foo(undefined); // OK
foo() // Error
4. Вы также можете разрешить и то, и другое, но аргумент ДОЛЖЕН быть указан.
function foo(bar: string | null | undefined) {
console.info(bar);
}
foo("Hello World!"); // OK
foo(null); // OK
foo(undefined); // OK
foo() // Error
5. С необязательный вы можете опустить аргумент или передать undefined
, НО НЕ null
.
function foo(bar?: string) {
console.info(bar);
}
foo("Hello World!"); // OK
foo(null); // Error
foo(undefined); // OK
foo() // OK
6. Чтобы разрешить все три особых случая, необязательный и null
можно комбинировать.
function foo(bar?: string | null) {
console.info(bar);
}
foo("Hello World!"); // OK
foo(null); // OK
foo(undefined); // OK
foo() // OK
Кроме того, необязательный можно использовать только в объявлениях параметров или других типов, таких как интерфейсы, а не в обычных переменных. Так как не было бы смысла опустить значение переменной при присвоении ей.
Таким образом,
let d?: string;
не имеет смысла и приводит к ошибке компиляции.
Для таких людей, как я, которые неправильно читают вопрос, перечисленное здесь поведение возможно только при включенной строгой проверке нулей. «strictNullChecks»: true в tsconfig.json
Вы не правы,
let d?: string
недействителен в TypeScript. См. github.com/microsoft/TypeScript/issues/13321