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 подобного типа не существует.