как я могу вывести 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 ?️)
я хочу лучшее из обоих миров
как я могу вывести тип, избегая общеговведите параметр, получите самый красивый результат и сохраните принцессу?