TypeScript中never类型变量能否赋值给有类型的对象属性?
TypeScript中
never类型可赋值给其他类型的原因 问题描述
我有一个函数在某些场景下返回类型为never。我原本认为返回never类型的函数结果不能赋值给指定了类型(如下方的string[])的对象属性。这是TypeScript的预期行为还是Bug?若为预期行为,请解释其合理性。
代码示例
interface LoaderData { disabledModules: string[] } function getDisabledModules(): never { throw new Error('Never returns'); } const disabledModules = getDisabledModules(); const data: LoaderData = { disabledModules, }
回答
这是TypeScript的预期行为,核心原因来自never类型的定义与类型系统的设计逻辑:
never是所有类型的子类型:在TypeScript的类型层级中,never代表"永远不可能存在的取值",因此它被定义为任意类型的子类型。子类型可以赋值给父类型是类型系统的基本规则,所以never可以赋值给string[]、number等任何类型。执行逻辑的安全性:返回
never的函数要么抛出异常,要么进入无限循环,程序执行到调用该函数的位置就会终止,不会产生实际的返回值。也就是说,disabledModules = getDisabledModules()这行代码永远不会完成赋值操作,因此不会出现"把不符合string[]类型的值赋给属性"的实际风险。实用场景适配:这种设计让开发者在编写错误处理、流程终止类的函数时,无需额外处理类型兼容问题。比如在参数校验失败时抛出异常的函数,返回
never后可以直接赋值给任意类型的变量,简化代码结构。
内容的提问来源于stack exchange,提问作者Bryan J Swift
相关产品推荐
相关产品推荐

