深入理解ts中的never

142 阅读1分钟

定义

never 类型是typescript中的底层类型。它自然被分配的一些例子:

  • 一个从来不会有返回值的函数 (如:如果函数内含有while(true){}),因为死循环,永远也不会有返回值

  • 一个总是会抛出错误的函数 (如:function foo() { throw new Error('not implemented')} ,因为error将不会有返回值)

例子

1、一个未定义的可以这么写:

let foo: never

2、抛出异常的函数:

let a: never = (() => {
    throw new Error('error')
})

3、永远不可能存在的情况

例子:

function foo (x: string | number): boolean {
    if (typeof x === 'string') {
        return true
    } else if (typeof x === 'number') {
        return false
    }
    
    return fail('error')
}

function fail(msg: string): never {
    throw new Error(msg)
}

能不能把上面这个例子的never改成void,改成void之后: 会有个报错不能将类型“void”分配给类型“boolean”。。但是类型never是可以分配给类型boolean的。

never 和 void有什么不同:

void 表示 没有任何类型
never 表示 永远不存在的值的类型。

当一个函数返回空值时,它的返回值为void类型
当一个函数永不返回时或总是抛出错误时,它的返回值为never类型

void类型可以被赋值(当strictNullChecking 为 false时)
never除了never本身以外,其他任何类型不能赋值给never