Перегрузка функции TypeScript для подписи гиперскрипта

Я в настоящее время балуюсь более сложными типами в машинописи, и мне было интересно, как можно определить функцию, подобную функции из гиперсценария. Я пробовал разные подходы, но я не могу успешно перегрузить 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

1 ответ

Решение

Я нашел ответ после того, как проснулся этим утром. В TypeScript сигнатура реализации не видна внешнему миру, поэтому вызывающее выражение должно соответствовать одной из перегрузок.

Кроме того, типы в сигнатуре реализации должны перехватывать все предыдущие перегрузки.

// 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 {
  // ...
}
Другие вопросы по тегам