Условно введите переменную, если задан определенный параметр

#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 }
  

Игровая площадка