Оглавление:
Карта сайта:
Оглавление:
Карта сайта:
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 подобного типа не существует.