0

私は現在、タイプスクリプトでより高度な型付けに手を出していますが、ハイパースクリプトのような関数をどのように定義するのか疑問に思っていました. さまざまなアプローチを試しましたが、h関数を正常にオーバーロードして、使用法コメントの下にリストされているすべての CallExpressions を渡すことができません。

これが私がこれまでに持っているものです:

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
4

1 に答える 1

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 {
  // ...
}
于 2016-12-03T08:42:36.667 に答える