如何避免TypeScript中结构一致、名称不同的接口重复定义?
解决方案
方案1:使用类型别名(Type Alias)
用类型别名复用Offer的结构,同时保留Bid和Ask的语义,这种方式不会触发ESLint的空接口报错:
interface Offer { price: number amount: number } type Bid = Offer; type Ask = Offer;
类型别名只是对原有类型的引用,完全保留Offer的结构,同时Bid和Ask的语义清晰,贴合金融场景的命名习惯。
方案2:局部禁用ESLint规则
如果坚持要用接口继承的方式,可以在空接口上方添加ESLint禁用注释,精准跳过这条规则的检查:
interface Offer { price: number amount: number } // eslint-disable-next-line @typescript-eslint/no-empty-interface interface Bid extends Offer {} // eslint-disable-next-line @typescript-eslint/no-empty-interface interface Ask extends Offer {}
这种方式既保留了接口继承的结构形式,又避免了ESLint报错,适合需要维持接口语法的场景。
方案3:添加标记性属性(推荐进阶用法)
给空接口添加一个可选的标记属性,既解决ESLint报错,还能在后续需要区分类型时派上用场:
interface Offer { price: number amount: number } interface Bid extends Offer { readonly type?: 'bid'; } interface Ask extends Offer { readonly type?: 'ask'; }
这个可选的type属性不会影响现有代码的使用,同时在需要类型守卫区分Bid和Ask时,能直接利用这个属性做判断,比如:
function isBid(offer: Bid | Ask): offer is Bid { return offer.type === 'bid'; }
内容的提问来源于stack exchange,提问作者GuillaumeNo
相关产品推荐
相关产品推荐

