Как создать перегруженный тип функции без предоставления конкретной функции?
Изучая тип перегруженной функции, кажется, что можно использовать несколько сигнатур вызовов в интерфейсе / типе объекта:
function a(input: string): string
function a(input: number): number
function a(input: string | number): string | number {
return input
}
type A = typeof a
type B = {
(input: string): string
(input: number): number
}
const b: B = a // Okay!
Определение той же идеи с типом объединения (без этого надоедливого универсального случая, который вам нужен, чтобы перегрузки были счастливы) также работает , типы совместимы в обоих направлениях!
type C = ((input: number) => number) & ((input: string) => string)
const c: C = b // Okay!
const a2: A = c // Okay too!
Но как мне теперь сделать функцию, подходящую для этого типа? Обязательно ли использовать также перегрузку?
const x: A = (input: string | number) => input
и
const y: A = (input: string | number) => {
if (typeof input === "number") return input
if (typeof input === "string") return input
throw "excrement"
}
оба сбоя с одинаковой ошибкой:
Type '(input: string | number) => string | number' is not assignable to type '{ (input: string): string; (input: number): number; }'.
Type 'string | number' is not assignable to type 'string'.
Type 'number' is not assignable to type 'string'.
Хуже всего то, что это происходит, даже если я использую менее читаемый тип объединения C
Type '(input: string | number) => string | number' is not assignable to type 'C'.
Type '(input: string | number) => string | number' is not assignable to type '(input: number) => number'.
Type 'string | number' is not assignable to type 'number'.
Type 'string' is not assignable to type 'number'.
Надеюсь, я делаю что-то явно не так, и это легко исправить.
Иначе, каковы мои лучшие варианты, когда мне нужно требовать, чтобы функция, переданная куда-то, обрабатывала несколько сигнатур вызовов с соответствующими типами возврата?