The Typescript Never type represents the type that never happens or the values that never occur. The following are such places where we use the never type
- The return type of function that never returns (infinite loop or always throws an error)
- Variables when narrowed by a Type guard that can never be true
Table of Content
Functions that never return
There are a few scenarios where functions might not return. The following examples show two such scenarios. The first example is an infinite Loop and the second example throws an error. In both examples, the function never returns
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | //Infinite loop // Inferred return type: void function infiniteLoop() { while (true) { } } // Always throws an error // Inferred return type: void function throwError() { throw new Error("Some errors occurred"); } |
TypeScript always infers the type as void
for function declarations if it cannot determine the return type. You can make the return type as Never
as shown below.
1 2 3 4 5 6 7 8 9 10 | function infiniteLoop() : never { while (true) { } } function throwError() : never { throw new Error("Some errors occurred"); } |
Type guard that can never be true
We use Type Guards to narrow down the type of an object within a conditional block. The Typescript infers the type as never if the conditional block is impossible to happen
For Example in the code below the variable padding
can be either a string
or number
. Hence the last else branch will never happen. The TypeScript infers the type of padding
variable inside the last else branch as never
1 2 3 4 5 6 7 8 9 10 11 12 | function padLeft(value: string, padding: string | number) { if (typeof padding === "number") { padding //Type of paddig is number } else if (typeof padding === "string") { padding //Type of paddig is string } else { padding //Type of paddig is never. This will never happen } } |
Characteristics of Never
You can assign Never to every other type.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | let neverVar:never; let v1:any let v2:number let v3:string let v4:boolean let v5:{} v1=neverVar; v2=neverVar; v3=neverVar; v4=neverVar; v5=neverVar; |
But you cannot assign any other type to never
(except never
itself).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | let neverVar:never; let v1:any let v2:number let v3:string let v4:boolean let v5:{} //The following results in an error neverVar=v1; neverVar=v2; neverVar=v3; neverVar=v4; neverVar=v5; |
The Typescript infers the return type as never
if a function expression or arrow function.
- has no return type annotation
- has no return statement
- Or has a return statement which returns never
- does not have an endpoint
(for function declarations void
is the default return type)
In the following examples, the TypeScript infers the return type as never.
1 2 3 4 5 6 7 8 9 10 11 12 13 | //function expression let x = function (message) { throw new (message); }; //arrow function let y = (message) => { throw new (message); } |
Not here as we specifically annotate the return type as void
1 2 3 4 5 | let x1 = function (message):void { throw new (message); }; |
If a function has its return type annotated with never
.
- All of its
return
statements (if any) must returnnever
- The endpoint of the function must not be reachable.
The TypeScript compiler throws error in the following examples as the both the functions are annotated with never type. Because the first example returns a string and the second one has end point.
1 2 3 4 5 6 7 8 9 10 11 | //Both of the following results in an error function x1(message):never { return message; }; function x2(message):never { let y= message; }; |
Void Vs Never
The never type looks very similar to void.
We use void when the function does return but does not return a value. The typescript infers the return value as void
.
In the following example, the arrow function does not return anything. But it does finish and return the control to back to the main program. The Typescript infers the return type as void
.
1 2 3 4 5 | let z = (a:number, b:number) => { let c=a+b; } |
The never return type when the function does not return at all. As in the following example, which enters into an infinite loop.
1 2 3 4 5 6 | function infiniteLoop() : never { while (true) { } } |
The void
type can have undefined
or null
as a value where as never cannot have any value
References
Read More