我有这样一个接口:
interface IInternalListener {
element: HTMLElement,
id: string,
type: string,
listener: EventListenerOrEventListenerObject,
useCapture: boolean
}
我还想使用这个接口:
interface IListener {
element: HTMLElement,
id: string | number,
type: string,
listener: EventListenerOrEventListenerObject,
useCapture: boolean
}
唯一的区别是id
的类型。我想使用DRY (Don't Repeat Yourself)
我如何创建这个没有复制粘贴。映射类型似乎是一种可行的方法,但在这个答案中,它们映射了所有的道具——Typescript:如何创建一个类型的副本,但改变属性类型
我只想改变一个道具。有人知道怎么做吗?我不需要使用映射类型,任何可行的解决方案都是可行的。TIA
有几种方法可以做到这一点。
1方式将公共逻辑提取到其他两个扩展的第三个接口中:
interface IWhatever {
element: HTMLElement,
type: string,
listener: EventListenerOrEventListenerObject,
useCapture: boolean
}
interface IListener extends IWhatever {
id: string
}
interface IInternalListener extends IWhatever {
id: string | number
}
2方式正如Robby Cornelissen在评论中指出的,你可以使用通用的:
interface IListener<T> {
id: T
element: HTMLElement,
type: string,
listener: EventListenerOrEventListenerObject,
useCapture: boolean
}
3
假设你不拥有侦听器接口,也无法更改它,但你想在其他接口中重用它:
interface IInternalListener extends Omit<IListener, 'id'> {
id: string | number
}
可以同时使用extends和Omit
实用程序类型
interface IInternalListener {
element: HTMLElement,
id: string,
type: string,
listener: EventListenerOrEventListenerObject,
useCapture: boolean
}
interface IListener extends Omit<IInternalListener, 'id'> {
id: string | number
}
基本上,我们将删除id
属性,并将其添加回您需要的首选类型。