如何在对象新增特定类型键时抛出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
相关产品推荐
相关产品推荐

