如何解决数组<类型的联合>到数组<泛型类型的联合>
我正在尝试定义通过 Wrapper 泛型类型关联的两个数组类型之间的关系:
interface WrapperType<T> {
innerValue: T;
}
type InnerArrayType = (TypeA | TypeB | TypeC)[];
type WrappedArrayType = (WrapperType<TypeA>|WrapperType<TypeB>|WrapperType<TypeC>)[];
但是,两个联合类型之间的信息。当其中一个更改时,另一个也必须手动更改。我想知道是否有一种可重用的实用程序类型,可以采用 InnerArrayType 和 WrapperType 并输出 WrappedArrayType。
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.
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>)[]
解决方法
这可以使用 distributive conditional type 实现:U extends infer V
部分是在联合中分配的部分。
type MagicUtility<T extends any[]> =
(T extends (infer U)[] ? U extends infer V ? WrapperType<V> : never : never)[]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。