[英]How to infer all of the possible generic types in typescript
我有一个函数,它接受Handler<I, O>
的记录并返回一个函数,该函数返回一个处理程序的O
:
type Handler<I, O> = { i: I, o: O, handler: (i: I) => O };
function handlerGroup<I, O>(handlers: Record<string, Handler<I, O>>): (key: string) => O {
return (key: string) => {
const { i, handler } = handlers[key];
return handler(i);
}
}
例如:
const handleT1: Handler<number, number> = { i: 1, o: 1, handler: (i) => i }
const handleT2: Handler<number, string> = { i: 1, o: "1", handler: (i) => i.toString() }
handlerGroup({ T1: handleT1 }) //: (key: string) => number
handlerGroup({ T2: handleT2 }) //: (key: string) => string
但是当我尝试添加超过 1 条记录时,问题就开始了:
// Type 'Handler<number, string>' is not assignable to type 'Handler<number, number>'.
// Types of property 'o' are incompatible.
// Type 'string' is not assignable to type 'number'.(2322)
handlerGroup({ T1: handleT1, T2: handleT2 }) // expected: (key: string) => number | string
问题是由于我输入handleGroup
,我不完全确定如何处理它。
所以我的问题是,如何让handleGroup
根据记录推断所有可能的O
?
我通过将处理程序本身作为通用移动来解决它,然后推断它的 O:
type Handler<I, O> = { i: I, o: O, handler: (i: I) => O };
type A<T> = T extends Record<string, Handler<any, infer U>> ? U : never;
function handlerGroup<H extends Record<string, Handler<any, any>>>(handlers: H): (key: string) => A<typeof handlers> {
return (key: string) => {
const { i, handler } = handlers[key];
return handler(i);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.