如何在 TypeScript 中为文档对象的方法创建签名重载

How to create a signature overload for a method of the document object in TypeScript

提问人:Rafael Furtado 提问时间:11/11/2022 更新时间:11/11/2022 访问量:45

问:

我正在使用没有任何组件框架/库(如 React 或 Vue)的 TypeScript,并且我正在使用 document.createElement 方法创建我的 DOM 组件,但既然我知道,这个方法只允许您传递要创建的元素的名称,之后我需要使用它们的 .setAttribute 方法为组件设置一些属性, 但是根据属性的数量,光是做就可能需要 5~7 行。

因此,我想为此方法创建一个重载,该重载可以接受更多参数作为要设置的属性,并在内部调用 .setAttribute 方法来设置它们

一些例子:

// The default way to set the attributes
const element = document.createElement("div");

element.setAttribute("attr1", "value1");
element.setAttribute("attr2", "value2");
...
element.setAttribute("attrN", "valueN");

// What I want to do
const element = document.createElement("div", {attr1: "value1", attr2: "value2", ..., attrN: "valueN"});

注意

我认为为 .createElement 方法创建一个重载可能不是一个好的做法,因为它会改变文档对象的默认行为,所以如果有任何关于如何处理它的建议,它将受到欢迎!😊

TypeScript DOM 重载 domdocument createelement

评论


答:

0赞 Dimava 11/11/2022 #1

既然你永远只有一个,那就没必要放上去,只要做一个新功能就行了documentcreateElementdocument

我也为自己做了一个(但有其他优先级:通过 id-class-attr 选择器,附加参数),你可以在这里检查它:https://github.com/Dimava/PoopJs/blob/master/poopjs/elm.ts#L25

至于正确的类型,请从那里定义和复制泛型。createElement

基本上是这样的:


export function elm<K extends keyof HTMLElementTagNameMap>(selector: K, attrs?: Record<string, string>): HTMLElementTagNameMap[K];
export function elm<E extends Element = HTMLElement>(selector: string, attrs?: Record<string, string>): E;
export function elm(): HTMLDivElement;
export function elm(selector: string = 'div', attrs: Record<string, string> = {}): HTMLElement {
    let el = document.createElement(selector);
    for (let [k, v] of Object.entries(attrs)) {
        el.setAttribute(k, v);
    }
    return el;
}