Инструменты пользователя

Инструменты сайта


typescript:types:never

Это старая версия документа!


Never примитивный тип¶ Примитивный типа данных Never служит для указания того, что какие-либо операции никогда не будут выполнены.

Never обозначается ключевым словом never и так же, как и void, не имеет явных значений.

Тип данных never является подтипом всех типов, что делает его совместимым со всеми остальными типами.

function action(): never {
  throw new Error();
}
 
class TypeSystem {
  static any: any = action(); // Ok
  static number: number = action(); // Ok
  static string: string = action(); // Ok
  static boolean: boolean = action(); // Ok
  static null: null = action(); // Ok
  static undefined: undefined = action(); // Ok
  static void: void = action(); // Ok
  static never: never = action(); // Ok
}
 
TypeSystem.never = TypeSystem.any; // Error
TypeSystem.never = TypeSystem.number; // Error
TypeSystem.never = TypeSystem.string; // Error
TypeSystem.never = TypeSystem.boolean; // Error
TypeSystem.never = TypeSystem.null; // Error
TypeSystem.never = TypeSystem.undefined; // Error
TypeSystem.never = TypeSystem.void; // Error
TypeSystem.never = TypeSystem.never; // Ok

Так как типу never нельзя присвоить значение, отличное от самого типа never, единственным местом, в котором его может использовать разработчик, является аннотация возвращаемого из функции или метода значения, с одной оговоркой. Тип never можно указать только той функции, из которой программа действительно никогда не сможет выйти.

Такой сценарий может выражаться в виде функции, вызов которой приведет к однозначному исключению или тело функции будет включать бесконечный цикл.

function error(message: string): never {
  throw new Error(message);
}
 
function loop(): never {
  while (true) {}
}

Вывод типов определит принадлежность возвращаемого функцией значения к типу never, только если он указан в аннотации возвращаемого типа явно.

function error(message: string): never {
  throw new Error(message);
}
 
function action() {
  // function action(): never
  return error('All very, very bad.');
}
 
let identifier = error(); // let identifier: never
let identifier = action(); // let identifier: never

Стоит заметить, что без явного указания типа never вывод типов определит принадлежность возвращаемого значения к типу void.

function error(message: string) {
  // function error(): void
  throw new Error(message);
}
 
function loop() {
  // function loop(): void
  while (true) {}
}

Тип never является уникальным для TypeScript. В JavaScript подобного типа не существует.

typescript/types/never.1675014164.txt.gz · Последние изменения: 2023/01/29 20:42 — werwolf