You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 04:17:36