如何用映射类型定义基于数组的TypeScript接口(遵循DRY)
如何用映射类型定义可扩展的接口?
你已经通过映射类型生成了对应的类型结构,但TypeScript的接口语法不支持直接在内部写映射类型。不过可以通过接口继承映射类型的方式实现需求,既遵循DRY原则,又保留接口可被实现、扩展的特性。
实现步骤:
- 保留你已有的基础定义:
const qualities = ["beauty", "cost", "upkeep"] as const export type QualityStrings = (typeof qualities)[number]
- 用映射类型生成基础属性结构的类型别名:
type QualitiesBase = { [V in QualityStrings]: number }
- 让目标接口继承这个类型别名:
export interface QualitiesInterface extends QualitiesBase {}
这样生成的QualitiesInterface和你手动定义的接口完全等价,同时可以正常被其他接口扩展或被类实现:
扩展接口示例:
export interface ExtendedQualities extends QualitiesInterface { durability: number // 新增属性 }
实现接口示例:
class FurnitureQualities implements QualitiesInterface { beauty = 8 cost = 15 upkeep = 3 }
这种方式既复用了QualityStrings的定义,避免了重复编写属性名,又保留了接口的所有特性,完全满足你的需求。
内容的提问来源于stack exchange,提问作者Cel
相关产品推荐
相关产品推荐

