【问题标题】:Array<Union of type>to Array<Union of generic type>Array<Union of type> 到 Array<Union of generic type>
【发布时间】:2021-04-15 10:02:48
【问题描述】:

我正在尝试定义两个数组类型之间的关系,由 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&lt;Generic of union&gt;。所以有办法将Array&lt;Generic of union&gt;转换为Array&lt;Union of generic&gt;,问题就解决了。但是,这似乎是一个不可能的问题: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>)[]

【问题讨论】:

    标签: typescript typescript-typings union-types generic-type-argument


    【解决方案1】:

    这可以使用distributive conditional type 来实现:U extends infer V 部分是通过联合分发的。

    type MagicUtility<T extends any[]> =
      (T extends (infer U)[] ? U extends infer V ? WrapperType<V> : never : never)[]
    

    Playground Link

    【讨论】:

      猜你喜欢
      • 2022-12-31
      • 1970-01-01
      • 2022-06-16
      • 1970-01-01
      • 2021-05-05
      • 1970-01-01
      • 2022-11-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多