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

将接口限制为与另一个接口相同的属性

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

    我在找一个方法 Confine<A, B> 一个接口到另一个接口,在这个接口中 A B 需要具有相同的属性。

    export type Merge<M, N> = Omit<M, Extract<keyof M, keyof N>> & N;
    
    interface Cat {
      cat: string | null,
      created_at: Date,
    };
    

    这样就可以了:

    type StrictCat = Confine<Cat, Merge<Cat, {
      cat: string,
    }>>
    

    这不太好:

    type StrictCat = Confine<Cat, Merge<Cat, {
      name: string,
    }>>
    
    2 回复  |  直到 7 年前
        1
  •  0
  •   jcalz    7 年前

    你能把这个变成 Minimum, Complete and Verifiable Example ?我猜 Merge 不是很重要(你可以替换 Merge<X, Y> 结果)。和 const varname = TypeFunction<> 不是有效的typescript。一旦你解决了这个问题,你能明确你所说的“这应该没问题”是什么意思吗?也就是说,你想要什么类型的 StrictCat 成为?

    上面说的,是 可能的 你想要的是

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

    但我不想花太多时间充实这个答案,如果它没有解决你的问题。谢谢!

        2
  •  1
  •   Przemyslaw Jan Beigert    7 年前

    A extends B B extends A 所以:

    type Check<A, B> = A extends B ?
        B extends A ? true : false
      : false;
    
    type Result = Check<{}, {}> // true
    type Result1 = Check<{ key: string }, {}> // false
    type Result2 = Check<{}, { key: string }> // false
    type Result3 = Check<{ key: string }, { key: string }> // true
    
    

    或者你可以指定 never 类型以确保不会使用

    Playground

    推荐文章