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

如何使用泛型验证嵌套对象的字段类型一致性?

解决方案

首先修正你代码里的两处细节问题:

  • 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 18:18:27