如何实现含可变数量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
相关产品推荐
相关产品推荐

