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

时间:2019-02-07 21:57:14

标签: typescript

我正在寻找一种方法Confine<A, B>到另一个接口,因为它AB都必须具有相同的属性。

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 个答案:

答案 0 :(得分:1)

A extends BB extends A时,A与B具有相同的键,因此:

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

或者代替false,您可以分配never类型以确保不会被使用

Playground

答案 1 :(得分:0)

您可以将其转换为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;

但是我不想花太多时间来充实这个答案,如果它不能解决您的问题。谢谢!