如何在TypeScript中获取泛型类型的内部类型?
提取TypeScript泛型类型的内部参数
这个场景我太熟悉了!想要从Observable<XXX>里把XXX掏出来,用TypeScript的条件类型推断(也就是infer关键字)就能轻松解决,不用绕弯路。
具体步骤:
- 先定义一个通用的工具类型,专门用来解开Observable的包裹:
// 工具类型:如果传入的是Observable<U>,就返回内部的U;否则返回原类型(做容错) type UnwrapObservable<T> = T extends Observable<infer U> ? U : T;
这里的infer U就是告诉TypeScript:“帮我推断出Observable里面的那个类型,给它起个名字叫U”,然后我们直接返回U就行。
- 结合你已有的代码,把
ReturnType的结果传给这个工具类型:
// 先拿到myMethod的返回类型(Observable<{ prop1: string, ... }>) type myClassReturn = ReturnType<MyClass['myMethod']>; // 再提取内部类型 type MyMethodInnerType = UnwrapObservable<myClassReturn>;
当然你也可以把两步合并成一行,省得单独定义myClassReturn:
type MyMethodInnerType = UnwrapObservable<ReturnType<MyClass['myMethod']>>;
拓展一下:
这个思路适用于所有泛型类型,比如你想提取Promise的返回值、Array的元素类型,都可以照葫芦画瓢:
- 解开Promise:
type UnwrapPromise<T> = T extends Promise<infer U> ? U : T;
- 解开Array:
type ArrayElement<T> = T extends Array<infer U> ? U : T;
这样以后遇到类似的泛型拆包需求,都可以用这个方法解决~
内容的提问来源于stack exchange,提问作者Rich
相关产品推荐
相关产品推荐

