Typescript - 是否可以从扩展接口引用接口?
Typescript - Is it possible to reference interfaces from extended interface?
我想为 HTMLElementTagNameMap 中的所有接口添加链接功能。
由于它们有几十个并且所有元素都是 HTMLElement
或扩展它,我认为应该有一种方法可以做这样的事情:
interface HTMLElement {
doSomething<K extends keyof HTMLElementTagNameMap>(anArgument: any): HTMLElementTagNameMap[K]
}
这当然行不通,因为每个扩展 HTMLElement
的接口现在都包含一个 doSomething
方法,该方法预期 return 任何 HTMLElementTagNameMap
值。相反,我希望 HTMLTableElement.doSomething
到 return 类型为 HTMLTableElement
的对象,HTMLDivElement.doSomething
到 return 类型为 HTMLDivElement
的对象等等。
这样的概括是否可能,或者我是否需要为每个接口'duplicate'它?
如果可能的话,我该怎么做?
我认为 return 类型的 this
是您想要的。
interface HTMLElement {
foo(): this;
}
const a = document.createElement("a");
// ...
const aFoo = a.foo();
// ^^^^
// HTMLAnchorElement
// ...
在演示中,您可以将鼠标悬停在分配有调用 foo
结果的变量上,然后查看类型是相应 HTML 元素的接口。
我想为 HTMLElementTagNameMap 中的所有接口添加链接功能。
由于它们有几十个并且所有元素都是 HTMLElement
或扩展它,我认为应该有一种方法可以做这样的事情:
interface HTMLElement {
doSomething<K extends keyof HTMLElementTagNameMap>(anArgument: any): HTMLElementTagNameMap[K]
}
这当然行不通,因为每个扩展 HTMLElement
的接口现在都包含一个 doSomething
方法,该方法预期 return 任何 HTMLElementTagNameMap
值。相反,我希望 HTMLTableElement.doSomething
到 return 类型为 HTMLTableElement
的对象,HTMLDivElement.doSomething
到 return 类型为 HTMLDivElement
的对象等等。
这样的概括是否可能,或者我是否需要为每个接口'duplicate'它?
如果可能的话,我该怎么做?
我认为 return 类型的 this
是您想要的。
interface HTMLElement {
foo(): this;
}
const a = document.createElement("a");
// ...
const aFoo = a.foo();
// ^^^^
// HTMLAnchorElement
// ...
在演示中,您可以将鼠标悬停在分配有调用 foo
结果的变量上,然后查看类型是相应 HTML 元素的接口。