Typescript принимает нулевые значения, когда набор типов не обнуляется

#typescript

#typescript

Вопрос:

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

1 || null

// Even when enforcing non-nullable
const foo2 = (): NonNullable => 1 || null

// Here tough, it works: null is not a number
const foo3 = (i: number): number => i || null» rel=»nofollow noreferrer»>Игровая площадка TS

 // Not sure why null is accepted here when I've specified number as the type
const foo = (): number => 1 || null

// Even when enforcing non-nullable
const foo2 = (): NonNullable<number> => 1 || null

// Here tough, it works: null is not a number
const foo3 = (i: number): number => i || null
  

Похоже, то же самое с undefined

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

1. Для 1 и 2: 1 || null известно компилятору как 1 , и поэтому тип является number , не number | null . Для 3: вам нужно включить --strictNullChecks опцию компилятора вкл.

Ответ №1:

Вы неправильно ввели свои функции. Чтобы ввести foo как () => number и определить его как возвращаемый null , вы должны написать, что:

 const foo
  : () => number // type def
  = () => null;  // function def
  

При включенных строгих проверках на нулевое значение это, как и ожидалось, number
= () => null;» rel=»nofollow noreferrer»>выдает ошибку
.