0%

【055】typescript:never类型

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

可能出现 never 的情况

  1. 函数抛出一个错误异常
1
2
3
const error = () => {
throw new Error('error')
}
  1. 函数包含一个无限循环
1
2
3
const loop = () => {
while(true) {}
}
  1. 类型判断或类型缩小的细化(全面性检查)

在条件语句中,如果 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
  1. 不能将 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
  1. 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
  1. 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
  1. 其他类型不能赋值给 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”