首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Array<Union of type>to Array<Union of genictype>

Array<Union of type>to Array<Union of genictype>
EN

Stack Overflow用户
提问于 2021-01-10 05:12:34
回答 1查看 162关注 0票数 1

我试图定义两种数组类型之间的关系,这种关系由包装器泛型关联:

代码语言:javascript
复制
interface WrapperType<T> {
  innerValue: T;
}

type InnerArrayType = (TypeA | TypeB | TypeC)[];
type WrappedArrayType = (WrapperType<TypeA>|WrapperType<TypeB>|WrapperType<TypeC>)[];

但是,这两种联合类型之间的信息。当其中一个发生变化时,另一个也必须手动更改。我想知道是否有一个可重用的实用程序类型可以接受InnerArrayType和WrapperType并输出WrappedArrayType。

代码语言:javascript
复制
type MagicUtility<T> = ???????

type WrappedArrayType = MagicUtility<InnerArrayType>;
// equivalent to
type WrappedArrayType = (WrapperType<TypeA>|WrapperType<TypeB>|WrapperType<TypeC>)[];

在我的用例中,TypeA,TypeB,TypeC.是预定义的、静态的和有限的。注意,它们不是字符串类型。

更新

我能够用下面的方法获得Array<Generic of union>。因此,有一种将Array<Generic of union>转换为Array<Union of generic>的方法,问题将得到解决。然而,这似乎是一个不可能的问题:https://github.com/Microsoft/TypeScript/issues/27272

代码语言:javascript
复制
interface MyWrapper<T> {
    inner: T;
}

type ArrayOfUnionToArrayOfUnionOfGeneric<T> = 
  T extends (infer U)[]
  ? MyWrapper<U>[]
  : never;

type Inner = (1 | 2 | 3)[];
type Outer = ArrayOfUnionToArrayOfUnionOfGeneric<Inner> // MyWrapper<1 | 2 | 3>[]

// MyWrapper<1 | 2 | 3>[] --(HOW???)--> (MyWrapper<1>|MyWrapper<2>|MyWrapper<3>)[]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-10 05:48:54

这是可以使用分布条件类型的:U extends infer V部分是在联合中分布的。

代码语言:javascript
复制
type MagicUtility<T extends any[]> =
  (T extends (infer U)[] ? U extends infer V ? WrapperType<V> : never : never)[]

操场连接

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65650306

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档