0

私は現在、typescriptのより高度な型付けを取り回しており、ハイパースクリプトのような関数をどのように定義するのだろうと思っていました。私はさまざまなアプローチを試しましたが、h関数にうまくオーバーロードできず、使用コメントの下にリストされているすべてのCallExpressionsを渡すことができません。ここでハイパースクリプト署名のためのTypeScript関数のオーバーロード

は、私がこれまで持っているものです。

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 
} 

は使用方法:

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

答えて

0

私は今朝目覚めた後の答えを見つけました。 TypeScriptでは、実装シグネチャは外部からは見えないため、呼び出し側の式はオーバーロードの1つと一致する必要があります。

さらに、実装シグネチャのタイプは、以前のすべてのオーバーロードを捕捉する必要があります。

// 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 { 
    // ... 
} 
関連する問題