TypeScript中如何根据对象数组key值动态约束关联对象类型
TypeScript 动态根据Column配置推导Row类型实现方法
核心思路是通过泛型捕获传入columns配置中key字段的字面量类型,再通过映射类型生成对应的Row结构,不需要额外手动声明类型,TS会自动做类型校验。
完整实现代码
// 定义支持泛型的Column类型,K为key字段的字面量联合类型 type Column<K extends string = string> = { key: K; title: string; }; const table = <K extends string>( columns: readonly Column<K>[], rows: Record<K, string>[] ) => { // 函数内部逻辑 };
效果验证
按照上述定义后,你给出的示例会自动获得类型约束:
table( [ { key: "firstName", title: "First Name" }, { key: "address", title: "Address" }, ], // ✅ 类型校验通过,包含所有对应key的属性 [{ firstName: "mKman", address: "1 First St" }] ); table( [ { key: "firstName", title: "First Name" }, { key: "address", title: "Address" }, ], // ❌ 类型校验报错:缺少address属性 [{ firstName: "mKman" }] );
关键说明
- 参数
columns加readonly修饰的作用:让TS可以直接从传入的数组字面量中推导具体的key字面量类型,不需要使用者手动给columns数组加as const断言,避免key类型被宽泛推导为string。 Record<K, string>是TS内置的工具类型,作用是生成键为联合类型K、值为string的对象类型,也就是你需要的Row结构。如果字段值不都是string,可以根据实际业务调整值类型,比如支持任意值写Record<K, unknown>,支持数字和字符串写Record<K, string | number>。- 如果需要字段可选,可以改成
Partial<Record<K, string>>[]作为rows的类型。
内容的提问来源于stack exchange,提问作者MkMan
相关产品推荐
相关产品推荐

