在打字稿中合并接口内的对象

its*_*ned 2 typescript typescript-typings

我在打字文件中有以下内容:

interface A {
    anObject: {
        data: string;
    };
    someOtherData: boolean;
}
Run Code Online (Sandbox Code Playgroud)

现在我想更改接口,以便anObject也包含data2。我希望最终的形式是

interface A {
    anObject: {
        data: string;
        data2: string;
    };
    someOtherData: boolean;
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试过这样做,但失败了:

interface A {
    anObject: {
        data2: string;
    }
}
Run Code Online (Sandbox Code Playgroud)

取而代之的是anObject兼具数据和数据2,它只有数据2。无论如何要保留原始密钥吗?

jca*_*alz 5

嗯,这样的事情怎么样:

原点

export interface A {
    anObject: {
        data: string;
    };
    someOtherData: boolean;
}
Run Code Online (Sandbox Code Playgroud)

扩展.ts

import {A as _A} from './orig'

interface A extends _A {
  anObject: _A['anObject'] & {
    data2: string;
  }
}
Run Code Online (Sandbox Code Playgroud)

即:原重命名A的方式进行,以_A进口。然后扩展它并data2通过将它与查找的属性相交将新属性与原始属性合并。 anObject

或者,如果您不介意A成为type别名而不是interface,则有更简单的方法:

扩展.ts

import {A as _A} from './playground'

type A = _A & {
  anObject: {
    data2: string;
  }
}
Run Code Online (Sandbox Code Playgroud)

...在这种情况下,您仍将原件重命名,但只需将其与新零件相交即可。这两种方法都可以为您提供所需的类型:

declare const a: A;
a.anObject.data.charAt(0); // okay
a.anObject.data2.charAt(0); // okay
Run Code Online (Sandbox Code Playgroud)

这有帮助吗?