解释 TypeScript 中 never 类型的用途
TypeScript 是一种类型严格的语言,我们需要为每个变量定义类型。此外,我们还需要定义函数的返回值类型以及函数参数的类型。
never 也是 TypeScript 中的一种类型,就像其他数据类型(如字符串、数字、布尔值、符号等)一样。我们可以使用 `never` 关键字来创建一个 never 类型的变量。
用户可以在确信任何情况永远不会发生时使用 never 类型。例如,当我们确定函数永远不会返回值时,可以使用 never 作为返回值类型。
语法
用户可以按照以下语法使用 never 类型作为变量的字面量。
// never type as a variable literal let variable: never; // never type as a function return type function func(): never { // write any condition such that the function shouldn't return any value }
在上述语法中,变量类型为 never,这意味着我们永远无法向变量存储任何值。此外,函数的返回值类型为 never,这意味着我们永远无法从函数返回值。
示例 1:使用 never 关键字作为字面量
在下面的示例中,我们定义了变量并使用 never 关键字作为字面量。之后,用户可以看到我们无法为 never 类型的变量赋值。如果尝试为 never 类型的变量赋值,TypeScript 编译器会生成错误。
// never type as a variable literal let variable: never; // The below code generates the error message like Type 'number' is not assignable to type 'never'. // variable = 10; // we can't print the variable before initializing it. // console.log(variable); // This will not work as we can't assign the value to the variable of never type // let variable2: never = 10; console.log("Working the variable of type never")
编译后,它将生成以下 JavaScript 代码:
// never type as a variable literal var variable; // The below code generates the error message like Type 'number' is not assignable to type 'never'. // variable = 10; // we can't print the variable before initializing it. // console.log(variable); // This will not work as we can't assign the value to the variable of never type // let variable2: never = 10; console.log("Working the variable of type never");
以上代码将产生以下输出:
输出
Working the variable of type never
示例 2:使用 "never" 作为函数的返回值类型
在下面的示例中,我们创建了 `sample` 和 `test` 函数。`sample` 函数无限次运行 while 循环,并且永远不会停止。`test` 函数也无限次运行 for 循环,因此它永远不会返回值,我们可以使用 never 作为函数的返回值类型。
此外,用户可以看到 TypeScript 永远不会调用 `sample()` 函数,因为 `test()` 函数的执行永远不会停止。
// defining the sample function, which never returns a value and never stops execution function sample(param1: string): never { while (true) { console.log("The value of the param1 is " + param1); } } // test function, which will return for loop for infinite time function test(param2: number): never { for (let i = 0; ; ) { console.log("The value of param2 is " + param2); } } // calling the test function test(20); // calling the sample function // sample function never invoked, as the test function will never stop sample("Hello");
编译后,它将生成以下 JavaScript 代码:
// defining the sample function, which never returns a value and never stops execution function sample(param1) { while (true) { console.log("The value of the param1 is " + param1); } } // test function, which will return for loop for infinite time function test(param2) { for (var i = 0;;) { console.log("The value of param2 is " + param2); } } // calling the test function test(20); // calling the sample function // sample function never invoked, as the test function will never stop sample("Hello");
示例 3
在这个示例中,我们创建了 `error` 函数,它总是抛出错误。因此,它永远不会从函数返回值。之后,我们从 `sample()` 函数调用了 `error()` 函数。
在输出中,用户可以看到以下代码显示错误。
// function that always throws an error function error(): never { throw new Error("Errors in the return type!"); } // calling the error() function from the sample() function function sample() { return error(); } sample();
编译后,它将生成以下 JavaScript 代码:
// function that always throws an error function error() { throw new Error("Errors in the return type!"); } // calling the error() function from the sample() function function sample() { return error(); } sample();
以上代码将产生以下输出:
输出
Error: Errors in the return type!
将 never 类型与其他数据类型联合或交叉使用
我们可以将 never 类型与其他数据类型(如数字、字符串或布尔值)一起用作字面量。如果我们获取 never 类型和数字类型的联合,则变量变为数字类型。
如果我们获取 never 类型和数字类型的交叉,则 never 类型始终覆盖,并且变量变为 never 类型。
语法
用户可以按照以下语法使用 never 类型作为其他数据类型的联合和交叉。
let var1: never | number; let var2: never & number;
在上述语法中,`var1` 既可以是 never 类型也可以是数字类型,而 `var2` 是 never 类型和数字类型的交叉,这意味着 never 类型始终覆盖数字类型。
示例 4
在下面的示例中,用户可以看到我们可以为 `var1` 分配数字值,因为数字类型覆盖了 never 类型。此外,我们无法为 `var2` 分配值,因为 never 类型覆盖了数字数据类型。
let var1: never | number; let var2: never & number; // we can assign value to the var1 as it is a type of number var1 = 30; // we can't assign value to the var2 as it is a type of never // var2 = 30; console.log("The value of var1 is " + var1);
编译后,它将生成以下 JavaScript 代码:
var var1; var var2; // we can assign value to the var1 as it is a type of number var1 = 30; // we can't assign value to the var2 as it is a type of never // var2 = 30; console.log("The value of var1 is " + var1);
以上代码将产生以下输出:
The value of var1 is 30
在本教程中,用户学习了 TypeScript 中的 never 类型。我们通过不同的示例了解了 never 类型的不同用例。当我们将 never 用作函数的返回值类型时,该函数应包含任何条件,这些条件永远不允许函数返回值。