如何为名称相似的变量集合创建TypeScript interface?
方案1:使用TypeScript映射类型生成纯类型(无运行时代码)
如果只需要类型定义,不需要对应的运行时对象,直接用映射类型配合数字范围工具类型就能实现,和手动写全量属性的interface效果完全一致:
// 生成从1到N的数字联合类型,最高支持千级数量完全够用 type CreateRange<N extends number, Acc extends number[] = []> = Acc['length'] extends N ? Acc[number] : CreateRange<N, [...Acc, [...Acc, 0]['length']]> // 生成1到55的数字联合类型 type VarRange = CreateRange<55> // 生成目标类型,所有属性都是string type VarType = { [K in VarRange as `Var ${K}`]: string } // 如果需要用interface而非type别名,直接继承即可 interface MyInterface extends VarType {}
以上方案要求TypeScript版本 >=4.1,支持模板字面量类型特性即可正常使用
方案2:同时生成运行时默认对象 + 对应类型
如果不仅需要类型定义,还要生成带默认值的实际运行时对象,可以用循环生成对象后通过typeof反向推导类型,避免类型和运行时代码重复编写:
// 复用上面的CreateRange工具类型 type CreateRange<N extends number, Acc extends number[] = []> = Acc['length'] extends N ? Acc[number] : CreateRange<N, [...Acc, [...Acc, 0]['length']]> // 生成运行时对象,同时推导类型 const createVarObject = <N extends number>(count: N, defaultValue = '') => { const obj = {} as { [K in `Var ${CreateRange<N>}`]: string } for (let i = 1; i <= count; i++) { obj[`Var ${i}` as const] = defaultValue } return obj } // 直接生成包含55个属性的对象,默认值为空字符串 const varObj = createVarObject(55) // 反向推导得到对应类型 type MyInterface = typeof varObj
后续如果要调整属性数量、修改属性前缀、更换属性值类型,只要对应修改模板字符串、循环参数、泛型约束即可,不用手动逐个维护属性列表。
内容的提问来源于stack exchange,提问作者Usama Khan
相关产品推荐
相关产品推荐

