0

Ich bin derzeit mit fortgeschrittenen Typings in Typoskript herum und fragte mich, wie man eine Funktion wie die von Hyperscript definieren würde. Ich habe versucht verschiedene Ansätze, aber ich bin nicht in der Lage, die h Funktion erfolgreich überladen und alle CallExpressions unter dem Verwendungs-Kommentar aufgeführt zu übergeben. HierTypeScript-Funktion überladen für Hyperscript-Signatur

ist das, was ich bisher:

interface IProps { 
    [key: string]: any; 
} 

function h(tag: string, props?: IProps): void; 
function h(tag: string, children: string): void; // <- marked as invalid 
function h(tag: string, props: IProps, children?: string): void { 
    // ...code goes here 
} 

Verbrauch:

h("div"); 
h("div", "Hello World"); 
h("div", { className: "test" }); 
h("div", { className: "test" }, "Hello World"); // <- marked as invalid 

Antwort

0

fand ich die Antwort nach diesem Morgen aufzuwachen. In TypeScript ist die Implementierungssignatur für die Außenwelt nicht sichtbar und daher muss der aufrufende Ausdruck mit einer der Überladungen übereinstimmen.

Darüber hinaus müssen die Typen in der Implementierungssignatur alle vorherigen Überlastungen abfangen.

// Overloads, must match one of these 
function h(tag: string, children?: string): void; 
function h(tag: string, props: IProps, children?: string): void; 

// Not visible for the outside world 
function h(tag: string, props: IProps | string, children?: string): void { 
    // ... 
}