TypeScript:有没有办法扩展多个接口并合并相同的属性?

Joj*_*oji 7 javascript typescript

我有两个接口AB它们有一个共同的属性

interface A {
  a: boolean;
  b: number;
  c: string;
  d: boolean;
}

interface B {
  d: string;
}

interface C extends A,B {}
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想C成为

{
  a: boolean;
  b: number;
  c: string;
  d: boolean | string; <- merged
}
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?我知道我可以Pick用来省略相同的密钥,然后扩展它,但还有其他方法吗?

Min*_*uel 5

干得好:

type Merge<X, Y> = {
    [K in (keyof X | keyof Y)]:
        (K extends keyof X ? X[K] : never)
        | (K extends keyof Y ? Y[K] : never)
};
Run Code Online (Sandbox Code Playgroud)

用法示例:

interface A {
  a: boolean;
  b: number;
  c: string;
  d: boolean;
}

interface B {
  d: string;
}

type C = Merge<A, B>;
// Result:
type C = {
    a: boolean;
    b: number;
    c: string;
    d: string | boolean;
}
Run Code Online (Sandbox Code Playgroud)

游乐场链接