TypeScript не автоматически синтезирует подписи вызовов в объединениях из перегруженных подписей вызовов. Существует давняя открытая проблема, microsoft / TypeScript # 14107 , с просьбой об этом, но я не уверен, будет ли она когда-либо реализована. Сейчас вам нужно сделать «что-то еще», которое включает в себя любое количество обходных путей:
Один из обходных путей - добавить подпись вызова объединения, которую вы хотите увидеть:
function f1(input: number): number;
function f1(input: string): string;
function f1(input: string | number): string | number; // added
function f1(input: string | number): string | number {
return input;
}
function f2(input: number): number;
function f2(input: string): string;
function f2(input: string | number): string | number {
return f1(input); // okay
}
Другим обходным решением является использование условных типов и обобщений для замены перегрузки одной подписью вызова:
function f1<T extends number | string>(input: T): T extends number ? number : string;
function f1(input: string | number): string | number {
return input;
}
function f2(input: number): number;
function f2(input: string): string;
function f2(input: string | number): string | number {
return f1(input); // okay
}
Другим обходным решением является использовать условную логику c при вызове f1()
, чтобы ее аргумент всегда был string
или number
и никогда string | number
:
function f2(input: number): number;
function f2(input: string): string;
function f2(input: string | number): string | number {
return typeof input === "number" ? f1(input) : f1(input); // okay
}
Наконец, окончательный обходной путь использовать утверждение типа :
function f2(input: number): number;
function f2(input: string): string;
function f2(input: string | number): string | number {
return f1(input as any) as string | number; // make it work
}
Временные решения представляют собой компромисс между сложностью, избыточностью и безопасностью типов. Я уверен, что есть и другие обходные пути; Вам решать, какой из них, если таковые имеются, лучше всего подходит для вашего случая использования. Во всяком случае, надеюсь, что это помогает; удачи!
Детская площадка ссылка на код