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
相关产品推荐
相关产品推荐

