如何在打字稿中组合对象属性?

时间:2016-05-05 04:51:05

标签: typescript

我想知道最好的方法,比如我有两个对象

var objectA = {
    propertyA: 1,
    propertyB: 2
    ...
    propertyM: 13
}

var objectB = {
    propertyN: 14,
    propertyO: 15
    ...
    propertyZ: 26
}

如果objectC是由

创建的
var objectC = Object.assign(objectA, objectB);

如何声明/描述objectC,以便编译器/ IDE知道它具有objectA和objectB的属性?

我想找到一种方法,而不需要为objectA和objectB定义接口。我不想两次为同一财产编写声明和定义/评估。如果我在对象上有太多属性,则此冗余非常重要。

(是否有可以提取现有对象的接口/类型的运算符?)

有可能吗?

4 个答案:

答案 0 :(得分:7)

  

所以编译器/ IDE知道它具有objectA和objectB的属性?

使用交集类型+泛型。例如。 from here

/**
 * Quick and dirty shallow extend
 */
export function extend<A>(a: A): A;
export function extend<A, B>(a: A, b: B): A & B;
export function extend<A, B, C>(a: A, b: B, c: C): A & B & C;
export function extend<A, B, C, D>(a: A, b: B, c: C, d: D): A & B & C & D;
export function extend(...args: any[]): any {
    const newObj = {};
    for (const obj of args) {
        for (const key in obj) {
            //copy all the fields
            newObj[key] = obj[key];
        }
    }
    return newObj;
};

更多

这里提到了两个:https://basarat.gitbooks.io/typescript/content/docs/types/type-system.html

答案 1 :(得分:4)

使用Typescript spread operator将其转换为Javascript Object.assign()

如果您需要深层树对象合并,则可以使用best-global

的更改功能

答案 2 :(得分:3)

尝试一下。

const person = { name: 'TRilok', gender: 'Male' };
const tools = { computer: 'Mac', editor: 'Atom' };
const attributes = { handsomeness: 'Extreme', hair: 'Brown', eyes: 'Blue' };

const summary = {...person, ...tools, ...attributes};

答案 3 :(得分:1)

  

(是否存在可以提取接口/类型的运算符   现有对象?有可能吗?)

你应该去 typeof

type typeA = typeof objectA;
type typeB = typeof objectB;

要合并它们,您可以使用交叉操作作为已经指出的basarat。

type typeC = typeA & typeB