0%

【055】typescript:never类型

TypeScript 使用 never 关键字来表示逻辑上不应该发生的情况和控制流,即不应该存在的状态。

可能出现 never 的情况

  1. 函数抛出一个错误异常

    1
    2
    3
    const error = () => {
    throw new Error('error')
    }
  2. 函数包含一个无限循环

    1
    2
    3
    const loop = () => {
    while(true) {}
    }
  3. 类型判断或类型缩小的细化(全面性检查)

    在条件语句中,如果 TypeScript 能够推断出某个分支永远不会执行,那么该分支的类型会被推断为 never

    1
    2
    3
    4
    5
    6
    7
    const isTrue = (val: 'A' | 'B') => {
    switch(val) {
    case 'A': break;
    case 'B': break;
    default: const isFalse: never = val
    }
    }

never 和 void 的区别

  1. 如果没有为函数指定返回类型,并且在代码中没有返回任何内容,TypeScript 将推断其返回类型为 void。在TypeScript中,不返回任何内容的 void 函数实际上返回的是 undefined。

    void 类型的值可以是 undefinednull

    1
    2
    const fn = () => {}
    console.log(fn()) // undefined
  2. 不能将 void 指定给 never

    1
    2
    const fn = () => {}    // const fn: () => void
    let aa: never = fn() // 不能将类型“void”分配给类型“never”

never 类型的特点

  1. never 类型会从联合类型中移除

    1
    2
    3
    4
    5
    6
    type a = unknown | never  // unknown
    type b = any | never // any
    type c = number | never // number
    type d = string | never // string
    type e = object | never // object
    type f = boolean | never // boolean
  2. never 类型与任意类型的交叉类型都是 never

    1
    2
    3
    4
    5
    6
    type g = unknown & never  // never
    type h = any & never // never
    type i = number & never // never
    type j = string & never // never
    type k = object & never // never
    type l = boolean & never // never
  3. never 可以赋值给任意类型

    1
    2
    3
    4
    5
    6
    7
    let m: never
    let n: unknown = m
    let o: any = m
    let p: number = m
    let q: string = m
    let r: object = m
    let s: boolean = m
  4. 其他类型不能赋值给 never

    1
    2
    3
    4
    let t: never = 'a'      // 不能将类型“string”分配给类型“never”
    let u: never = 123 // 不能将类型“number”分配给类型“never”
    let v: never = { a: 1 } // 不能将类型“{ a: number; }”分配给类型“never”
    let w: never = true // 不能将类型“boolean”分配给类型“never”