如何使用泛型验证嵌套对象的字段类型一致性?
解决方案
首先修正你代码里的两处细节问题:
Item类型定义里的字段B是大写,但示例对象里用的是小写b,先统一为小写保证类型匹配;- 示例对象里的分号/逗号混用,统一为逗号符合语法规范。
修正后的基础类型:
type Item<T> = { a: T; b: T };
要实现无需手动指定泛型、自动推断每个Item的类型、且a/b类型不一致时报错的需求,最简洁的方式是用泛型函数做类型约束:
// 定义泛型函数,自动推断每个属性的Item类型 const createItems = <T extends Record<string, unknown>>(obj: { [K in keyof T]: Item<T[K]> }) => obj; // 测试代码 const items = createItems({ first: { a: 1, b: 2 }, // 正常,自动推断T为number second: { a: 'asd', b: 'asd' }, // 正常,自动推断T为string third: { a: 1, b: 'qwe' } // 此处直接报错:类型"string"不能赋值给类型"number" } as const);
核心逻辑说明
- 泛型函数
createItems会遍历对象的每个属性,自动推断对应Item的泛型参数T; - 内部通过
{ [K in keyof T]: Item<T[K]> }约束每个属性必须符合Item结构,强制a和b类型一致; as const可以保留字面量类型的精确性,如果不需要精确的字面量类型,直接去掉即可。
如果不想用函数,也可以直接用泛型类型断言,但需要手动补全泛型参数,不如函数方式直观:
type Items<T> = { [K in keyof T]: Item<T[K]> }; const items = { first: { a: 1, b: 2 }, second: { a: 'asd', b: 'asd' }, third: { a: 1, b: 'qwe' } // 报错 } as const as Items<{ first: number; second: string; third: never; // 类型不匹配导致此处也报错 }>;
内容的提问来源于stack exchange,提问作者dr.Keinakh
相关产品推荐
相关产品推荐

