📜  解释在 TypeScript 中从不输入的目的

📅  最后修改于: 2022-05-13 01:56:54.812000             🧑  作者: Mango

解释在 TypeScript 中从不输入的目的

never类型表示从不出现的各种类型的值。这意味着它可能是从不返回特定值的函数的返回类型。在本文中,我们将了解 TypeScript 中的 never 类型以及使用它的原因。

句法:

// For variable
const GFG : never;  

// For function
function geeks(): never {  
    const geeksForGeeks = 1;
}

以下示例将说明never type well 的用途或用法:

示例 1:此示例表示从未发生的函数的返回类型。由于无限循环,无法确定返回类型。

Javascript
// Function which executes an infinite 
// amount of times and never ends.
  
function infiniteLoop(): never{
    while(true){
        console.log('GeekforGeeks');
    }
}


Javascript
// Function always throwing an error/exception
  
function err(message: string): never{
    throw Error(message);
}
  
err("My error!");


Javascript
// Function demonstrating exhaustive checks
function f(temp: string | number): boolean {
    if (typeof temp === "string") {
        return true;
    } else if (typeof temp === "number") {
        return false;
    }
  
    // Not a string or a number. Value can't
    // occur here hence type is "never"
    return fail("Unexhaustive");
}
  
function fail(msg: string): never {
    throw new Error(msg);
}
  
console.log(f(23)); // Number
console.log(f("String")); // String


Javascript
type SomeNonNullable = T extends null | undefined ? never : T;
type A = SomeNonNullable;
type B = SomeNonNullable;
type C = SomeNonNullable;
   
const x: A = true; // Boolean
const y: B = 1; // Number
const z: C = undefined; // Will return an error


输出:

由于程序中存在无限循环,它可能会使程序崩溃或冻结您的计算机。执行将自动停止,并且不生成任何输出。

示例 2:此示例还表示一个从不发生的函数的返回类型。但不同的是,函数总是抛出错误或异常。

Javascript

// Function always throwing an error/exception
  
function err(message: string): never{
    throw Error(message);
}
  
err("My error!");

输出:

示例 3:在这里,如果变量temp既不是字符串也不是数字,则它具有从未分配给它的类型,因为 TypeScript 已确定没有任何剩余。

Javascript

// Function demonstrating exhaustive checks
function f(temp: string | number): boolean {
    if (typeof temp === "string") {
        return true;
    } else if (typeof temp === "number") {
        return false;
    }
  
    // Not a string or a number. Value can't
    // occur here hence type is "never"
    return fail("Unexhaustive");
}
  
function fail(msg: string): never {
    throw new Error(msg);
}
  
console.log(f(23)); // Number
console.log(f("String")); // String

输出:

在每个实例中,由于没有定义的返回类型注释或任何可到达的端点,TypeScript 会自动推断never类型。

除了更好的类型安全性,如上面的示例中清楚地展示的那样, never类型还有另一个常见的用例,即条件类型。可以从程序中排除不需要的类型。

示例 4:下面的代码片段给出了一个想法:

Javascript

type SomeNonNullable = T extends null | undefined ? never : T;
type A = SomeNonNullable;
type B = SomeNonNullable;
type C = SomeNonNullable;
   
const x: A = true; // Boolean
const y: B = 1; // Number
const z: C = undefined; // Will return an error

输出:

在这里,我们正在检查T是否为空或未定义。如果是,那么我们指出它不应该是可访问的(无法访问的代码)。