Вывести тип аргумента, чтобы избежать неприглядного общего? - PullRequest
0 голосов
/ 08 октября 2019

как я могу вывести O из конкретного obj, переданного в качестве параметра?

export function pubsubs<O extends {[key: string]: Pubsub}>(
  obj: O // extends infer U ? U : never
   //        ↑
   //    (hilariously failed attempt to infer)
): {
  pub: Pubify<O>
  sub: Subify<O>
} {

  // ... generate pub and sub based on obj ...

  return {pub, sub}
}

желаемый красивый результат, так близко, пока так далеко ...

const {pub, sub} = pubsubs({ // ← (want to infer from this first arg)
 //                      ↑
 //             (no generic, so nice, so clean!)

  userLogout: pubsub(),
  userLoading: pubsub(),
  userError: pubsub<(error: Error) => void>(),
  userLogin: pubsub<(auth: LoginDetail) => void>(),
})

// but the typings fail to be inferred!
sub.userError(error => {})
 //            ↑
 //    (error type is 'any' ?)

хромое обходное решение без вывода:

const input = {
  userLogout: pubsub(),
  userLoading: pubsub(),
  userError: pubsub<(error: Error) => void>(),
  userLogin: pubsub<(auth: LoginDetail) => void>(),
}

const {pub, sub} = pubsubs<typeof input>(input)
 //                         ↑
 //        (lame verbose generic, should be inferred)

// typings are preserved
sub.userError(error => {})
 //            ↑
 //       (typescript knows ?️)

я хочу лучшее из обоих миров

как я могу вывести тип, избегая общеговведите параметр, получите самый красивый результат и сохраните принцессу?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...