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

如何实现含可变数量A<year>键的TypeScript接口/类型?

实现可变年份属性的TypeScript类型

可以通过泛型+映射类型/Record工具类型来实现需求,核心是把传入的年份数组类型转换为对应的A<year>键集合,再合并公共属性。

方案一:类型别名(更灵活)

直接用类型别名结合键重映射,生成包含指定年份属性和公共属性的类型:

type A<year extends number> = `a${year}`;

type AStatistics<years extends readonly number[]> = 
  // 把数组中的每个年份转为A<year>作为键,值类型为number
  { [K in years[number] as A<K>]: number } & {
    // 公共必填属性
    aCommonProp: string;
  };

测试示例

// 指定年份为2022、2023
type Stats2022_2023 = AStatistics<[2022, 2023]>;

// 最终类型等价于:
// {
//   a2022: number;
//   a2023: number;
//   aCommonProp: string;
// }

方案二:接口扩展Record类型

如果偏好接口写法,可以通过扩展Record工具类型实现,Record的键参数传入年份联合类型对应的A<year>:

type A<year extends number> = `a${year}`;

interface AStatistics<years extends readonly number[]> 
  extends Record<A<years[number]>, number> {
    aCommonProp: string;
}

关键逻辑说明

  • years[number]:提取数组泛型中所有元素的联合类型(比如[2022,2023]会转为2022 | 2023)
  • A<years[number]>:把年份联合类型转为对应的字符串字面量联合类型(比如"a2022" | "a2023")
  • Record<...>:生成以这些字符串为键、值为number的类型,接口扩展后再添加公共属性即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 06:47:13