代码之家  ›  专栏  ›  技术社区  ›  ThomasReggi

从其他两个泛型创建泛型

  •  0
  • ThomasReggi  · 技术社区  · 7 年前

    DeepMerge Confine 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>>;
    

    enter image description here

    类型“DeepMerge”不满足约束“局限扩展>”。 类型“B{[K in keyof(B&Pick>)]:K extends keyof B?K extends keyof A DeepMerge:B[K]:K extends keyof A[K]:never;}不可分配给类型“CONSTRIENTEXTENTION>”。

    如何合并这两个泛型?

    2 回复  |  直到 7 年前
        1
  •  1
  •   jcalz    7 年前

    我想知道你想要什么。。。谁知道呢,也许是这样:

    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;
    

    如果你能编辑这个问题来解释你想做什么,那会很有帮助。

        2
  •  0
  •   ThomasReggi    7 年前

    这是可行的,但非常冗长:

    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>;
    }
    
    推荐文章