#typescript
#typescript
Вопрос:
Я пытаюсь создать функцию, которая возвращает некоторые данные, и эти данные могут быть изменены с помощью промежуточного программного обеспечения, которое в основном является обратным вызовом, который моя функция принимает в своих параметрах.
Вот упрощенная версия моей функции:
const parse = <T, M>(data: T, middleware?: (payload: T) => M) => {
// how can I type this variable?
let resu< // something like `middleware ? M : T`
if (middleware) {
result = middleware(data)
} else {
result = data;
}
return resu<
}
// user is `any` when it should be `{ name: string; age: number }`
const user = parse({ name: "Bob" }, (data) => ({ ...data, age: 35 }))
Как я могу ввести возврат моей функции (иначе result
)? Я мог бы сделать что-то вроде let result: T | M;
, но тогда я получу ошибку при попытке получить доступ к свойству, которое было добавлено M
в промежуточное программное обеспечение ( user.age
в данном случае).
Ответ №1:
Для этого можно использовать перегрузку функций:
// function signatures
function parse<T>(data: T): T;
function parse<T, M>(data: T, middleware: (payload: T) => M): M;
// function declaration
function parse <T, M>(data: T, middleware?: (payload: T) => M) {
return middleware ? middleware(data) : data;
}
const bob = parse({ name: "Bob" }, (data) => ({ ...data, age: 35 }))
// bob has type { age: number, name: string }
const alice = parse({ name: "Alice" })
// alice has type { name: string }