Может ли необязательный параметр быть нулевым в TypeScript?

Согласно Эта статья, когда в 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 по написанию кода?

Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
45
0
35 402
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

let d?: string; объявляет тип как string | undefined.

Это связано с тем, что undefined является значением по умолчанию для переменных JS.

Вы не правы, let d?: string недействителен в TypeScript. См. github.com/microsoft/TypeScript/issues/13321

Karel Kral 14.01.2021 14:38
Ответ принят как подходящий

Обновлено: Важная заметка Как отметил Квентин С в комментарии ниже, перечисленное здесь поведение возможно только при включенной строгой проверке нулевого значения: "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

Quentin C 09.01.2021 18:40

Другие вопросы по теме