[英]Alternatives for a generic type with generic type parameters in TypeScript
假设我有两种类型的泛型函数,它们的返回类型不同。 一个具有返回类型T
,另一个具有T[]
:
type F1 = <T>(t: T) => T
type F2 = <T>(t: T) => T[]
我想知道如何将这两种类型合并为一种通用类型。 我想象这样做的方式是让新的泛型类型接受另一个泛型类型作为参数(如 C++ 的 模板模板参数):
// Caution, Fantasy-TypeScript ahead!
// Accepts generic type R as parameter
// to transform return type of generic function
type F<R> = <T>(t: T) => R<T>
// define F1 and F2 in terms of F
type Id<T> = T
type F1 = F<Id>
type F2 = F<Array>
但是,尚不支持泛型泛型参数(2021 年 3 月)。 有关详细信息,请参阅TypeScript 问题和相关的 SO 问题。
TypeScript 中的替代方案是什么?
一个简单的方法是使用条件类型:
type F<R> = <T>(t: T) => R extends void[] ? T[] : T
type F1 = F<void> // <T>(t: T) => T
type F2 = F<void[]> // <T>(t: T) => T[]
使用Indexed Access Types可以实现更灵活的实现:
type R<T> = { Id: T, Array: T[] }
type F<K extends keyof R<any>> = <T>(t: T) => R<T>[K]
type F1 = F<'Id'> // <T>(t: T) => T
type F2 = F<'Array'> // <T>(t: T) => T[]
有关此技术的更复杂示例,请参阅我对类似问题的回答。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.