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

TypeScript中与Record<string,never>交叉的类型无法正常赋值问题

报错原因

Record<string, never>的语义是:所有字符串类型的键,对应的值类型必须为never。never是TypeScript的底层类型,不存在任何可以赋值给never的实际值。
你使用交叉类型&合并Record<string, never>和{ propA: string }时,相当于对propA这个键同时施加了两个类型约束:值必须是never、值必须是string。两个类型没有任何交集,合并后propA的最终类型为never,因此给它赋值字符串会触发类型报错。

空对象类型的正确实现

分两种场景选择对应方案:

  • 如果你需要的是纯空对象类型,不允许存在任何属性,直接使用Record<string, never>即可,不需要做交叉合并:
// 正常运行
const emptyObj: Record<string, never> = {}
// 会触发报错,不允许存在任何属性
const emptyObj2: Record<string, never> = { a: 1 }
  • 如果你需要的是允许存在指定属性、不允许存在其他额外属性的类型(也就是你示例的需求场景),可以用自定义映射类型实现:
// 泛型工具类型:约束对象只能存在T中定义的属性
type NoExtraProps<T> = T & { [K in Exclude<string, keyof T>]?: never }

type TypeA = NoExtraProps<{ propA: string }>

// 正常运行
const a: TypeA = { propA: "lsjdf" }
// 触发报错,不允许存在propA之外的属性
const b: TypeA = { propA: "lsjdf", otherProp: 123 }

注意:不要直接使用{}作为空对象类型,它的语义是「所有非null/undefined的类型都可以赋值」,无法实现严格的空对象约束。

内容的提问来源于stack exchange,提问作者Xen_mar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 21:45:04