Подтвердить что ты не робот

Как объединить свойства объекта в 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 знает, что он обладает свойствами как объекта А, так и объекта В?

Я хотел бы найти способ без необходимости определения интерфейсов для объектов A и objectB. Я не хочу писать декларацию и определение/оценку для одного и того же свойства дважды. Эта избыточность значительна, если у меня слишком много свойств для объекта.

(Есть ли оператор, который может извлечь интерфейс/тип существующего объекта?)

Возможно ли это?

4b9b3361

Ответ 1

поэтому компилятор /IDE знает, что он обладает свойствами как объекта A, так и объекта B?

Используйте тип пересечения + generics. Например. здесь

/**
 * 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

Ответ 2

Похоже, это должно сделать трюк:

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

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

var objectC = {...objectA, ...objectB};

var a = objectC.propertyA;

var n = objectC.propertyN;

На основании этой статьи: https://blog.mariusschulz.com/2016/12/23/typescript-2-1-object-rest-and-spread

Ответ 3

(Есть ли оператор, который может извлечь интерфейс/тип существующий объект? Возможно ли это?)

Вы должны пойти для typeof.

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

Чтобы объединить их, вы можете использовать операцию пересечения, как уже указывал basarat.

type typeC = typeA & typeB