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

如何创建键为泛型类型键子集的TypeScript对象?

解决TypeScript泛型类中headers参数仅需泛型键子集的问题

你当前的核心问题是Table类的headers参数被定义为必须包含泛型T的所有键,但实际业务只需要传入T键的子集。要实现这个需求,只需要把映射类型改为可选属性即可,以下是两种常用的实现方式:

方法1:在映射类型中添加?标记

直接修改headers的类型定义,给每个键加上可选符号?,这样就允许只传入T的部分键:

export abstract class Table<T> {
  constructor(
    protected data: T[],
    // 现在headers是T的键的子集,每个键对应的值为string类型
    protected headers: { [key in keyof T]?: string }
  ) {}
  //...abstract methods
}

interface User {
  username: string;
  password: string;
  age: number;
}

class UserTable extends Table<User> {
  constructor(data: User[]) {
    // 现在可以正常编译,仅传入需要的键
    super(data, {
      username: 'User',
      age: 'Age',
    });
  }
}

方法2:使用Partial工具类型

TypeScript内置的Partial工具类型可以自动将目标类型的所有属性转为可选,用它包裹原映射类型也能达到同样效果:

export abstract class Table<T> {
  constructor(
    protected data: T[],
    // Partial将原必填的映射类型转为可选,实现子集需求
    protected headers: Partial<{ [key in keyof T]: string }>
  ) {}
  //...abstract methods
}

两种方法功能完全一致,任选其一即可。本质都是让headers的每个键都属于T的键集合,但不强制全部存在,完美匹配你需要的「泛型T的键的子集,值为string」的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 10:01:17