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

如何在对象新增特定类型键时抛出TypeScript类型错误

实现自动校验的键提取类型ExtractKeysByType

先看需求:给定MyType类型,要定义一个类型,让声明的数组必须包含所有值类型为指定T的键;后续给MyType新增同类型键时,数组没同步更新就触发类型错误。

直接上代码实现:

type MyType = {
  foo: number;
  bar: string;
  baz: string;
}

// 提取对象中值类型匹配T的所有键
type ExtractKeysByType<Obj, T> = {
  [K in keyof Obj]: Obj[K] extends T ? K : never
}[keyof Obj];

// 强制数组必须包含所有提取到的键(缺漏就报错)
type RequiredKeysArray<Obj, T> = Array<ExtractKeysByType<Obj, T>> & {
  0: ExtractKeysByType<Obj, T>
};

代码说明

  • ExtractKeysByType:遍历对象的每个键,判断对应值是否属于目标类型T,符合条件的保留键名,不符合的设为never;最后通过[keyof Obj]把所有有效键合并成联合类型。
  • RequiredKeysArray:用交叉类型做了个小技巧——给数组类型额外加了索引0的约束,让TypeScript强制检查数组是否覆盖了联合类型的所有成员,只要缺一个就会报错。

验证示例

// ✅ 正确:包含所有number类型的键
const numberFields: RequiredKeysArray<MyType, number> = ['foo'];

// ❌ 错误:缺少baz,直接触发类型错误
const stringFields: RequiredKeysArray<MyType, string> = ['bar'];

// ✅ 正确:包含所有string类型的键
const correctStringFields: RequiredKeysArray<MyType, string> = ['bar', 'baz'];

后续如果给MyType新增qux: string属性,RequiredKeysArray<MyType, string>就会要求数组必须包含bar、baz、qux三个键,只要数组没加qux,立刻会抛出类型错误,完全满足需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 02:57:31