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

如何创建仅接受另一类型属性列表的TypeScript泛型FormField类型?

解决方案:创建严格类型的FormField泛型类型

你需要的是让每个表单字段的name和value严格关联到传入类型的属性,同时附加checked属性。可以通过映射类型+联合类型的组合实现:

// 单个表单字段的类型:为T的每个属性生成匹配的name/value/checked结构
type FormFieldItem<T> = {
  [K in keyof T]: {
    name: K;
    value: T[K];
    checked: boolean;
  };
}[keyof T];

// FormField是单个字段类型的数组
type FormField<T> = FormFieldItem<T>[];

验证示例

interface User { name: string; age: number; }
// 完全合法的定义
const userForm: FormField<User> = [
  { name: "name", value: "Toto", checked: false },
  { name: "age", value: 30, checked: true }
];

interface House { width: number; height: number; }
// 完全合法的定义
const houseForm: FormField<House> = [
  { name: "width", value: 100, checked: true },
  { name: "height", value: 50, checked: false }
];

// 以下代码会触发类型错误,符合预期
// const invalidForm: FormField<User> = [
//   { name: "name", value: 123, checked: false } // 错误:value应为string类型
// ];

原理说明

  • FormFieldItem<T>先通过映射类型遍历T的所有属性,为每个属性生成对应的字段结构;再通过[keyof T]将映射结果转换为联合类型,确保每个字段的name和value类型严格绑定。
  • FormField<T>作为该联合类型的数组,既限制了name只能是T的属性名,也保证了value的类型与对应属性完全匹配,同时强制要求包含checked布尔属性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 08:30:59