【问题标题】:Creating generic from two other generics从其他两个泛型创建泛型
【发布时间】:2019-07-02 21:59:58
【问题描述】:

我正在尝试使用两个泛型 DeepMergeConfine 创建一个 ConfineDeepMerge

type DeepPartial<T> = {
  [P in keyof T]?: T[P] extends (infer U)[]
    ? DeepPartial<U>[]
    : T[P] extends ReadonlyArray<infer U>
      ? ReadonlyArray<DeepPartial<U>>
      : DeepPartial<T[P]>
};

type ConfineExtention<A, B> = { [K in keyof B]: K extends keyof A ? (DeepPartial<A>[K]) : never };
type Confine<A, B extends ConfineExtention<A, B>> = B;

type DeepMerge<T, U> = [T, U] extends [object, object] ?
  {
    [K in keyof (U & Pick<T, Exclude<keyof T, keyof U>>)]: (
      K extends keyof U ? (
        K extends keyof T ? DeepMerge<T[K], U[K]> : U[K]
      ) : (
        K extends keyof T ? T[K] : never
      )
    )
  } : U;

type ConfineDeepMerge<A, B> = Confine<A, DeepMerge<A, B>>;

类型“DeepMerge”不满足约束“ConfineExtention>”。 'B 型 | { [K in keyof (B & Pick>)]: K 扩展 keyof B ? K 扩展 keyof A ? DeepMerge : B[K] : K 扩展 keyof A ? A[K] :从不; }' 不可分配给类型 'ConfineExtention>'。 类型“B”不可分配给类型“ConfineExtention>”。 [2344]

如何合并这两个泛型?

【问题讨论】:

    标签: typescript


    【解决方案1】:

    这可行,但非常冗长:

    type Merge<M, N> = Omit<M, Extract<keyof M, keyof N>> & N;
    // type Confine<A, B extends { [K in keyof B]: K extends keyof A ? A[K] : never }> = B;
    type ConfineMerge<T, C extends ExtentionForConfineMerge<T, C>> = Pick<T, Exclude<keyof T, keyof C>> & C;
    type ExtentionForConfineMerge<T, C> = {[K in keyof C]: K extends keyof T ? (Partial<T>[K]) : never};
    
    export interface Discover <
    Raw,
    RawOverrides extends ExtentionForConfineMerge<Raw, RawOverrides>,
    Proto extends ExtentionForConfineMerge<Merge<Raw, RawOverrides>, Proto>,
    ProtoOverrides extends ExtentionForConfineMerge<Merge<Merge<Raw, RawOverrides>, Proto>, ProtoOverrides>,
    > {
      Raw: Raw;
      RawOverrides: ConfineMerge<Raw, RawOverrides>;
      Proto: ConfineMerge<Merge<Raw, RawOverrides>, Proto>;
      ProtoOverrides: ConfineMerge<Merge<Merge<Raw, RawOverrides>, Proto>, ProtoOverrides>;
    }
    

    【讨论】:

      【解决方案2】:

      我正在试图弄清楚你想要什么......谁知道呢,也许是这样:

      type ConfineMerge<T, C extends {
        [K in keyof C]: K extends keyof T ? (Partial<T>[K]) : never
      }> = Pick<T, Exclude<keyof T, keyof C>> & C;
      

      如果您可以编辑问题以解释您正在尝试做什么,那将会很有帮助。

      【讨论】:

      • 是的,这个问题需要更清楚。有什么办法可以使用这两个泛型来形成第三个?
      • 我更新了它以反映最近的问题。仍然只是想找到一种方法将这些东西组合在一起。
      猜你喜欢
      • 1970-01-01
      • 2022-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多