繁体   English   中英

如何推断打字稿中所有可能的泛型类型

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM