[typescript] 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에 대한 인터페이스를 정의 할 필요없이 방법을 찾고 싶습니다. 동일한 속성에 대한 선언 및 정의 / 평가를 두 번 작성하고 싶지 않습니다. 이 중복성은 객체에 너무 많은 속성이있는 경우 중요합니다.

(기존 객체의 인터페이스 / 유형을 추출 할 수있는 연산자가 있습니까?)

가능할까요?



답변

다음과 같이 트릭을 수행해야합니다.

var objectA = {
    propertyA: 1,
    propertyB: 2,
    .
    . // more properties here
    .
    propertyM: 13
};

var objectB = {
    propertyN: 14,
    propertyO: 15,
    .
    . // more properties here
    .
    propertyZ: 26
};

var objectC = {...objectA, ...objectB}; // this is the answer

var a = objectC.propertyA;

var n = objectC.propertyN;

이 기사를 기반으로 : https://blog.mariusschulz.com/2016/12/23/typescript-2-1-object-rest-and-spread


또한 분해에서 변수의 순서가 중요합니다. 다음을 고려하세요:

var objectA = {
    propertyA: 1,
    propertyB: 2, // same property exists in objectB
    propertyC: 3
};

var objectB = {
    propertyX: 'a',
    propertyB: 'b', // same property exists in objectA
    propertyZ: 'c'
};

// objectB will override existing properties, with the same name,
// from the decomposition of objectA
var objectC = {...objectA, ...objectB};

// result: 'b'
console.log(objectC.propertyB);

// objectA will override existing properties, with the same name,
// from the decomposition of objectB
var objectD = {...objectB, ...objectA};

// result: '2'
console.log(objectD.propertyB);


답변

그래서 컴파일러 / IDE는 objectA와 objectB의 속성을 모두 가지고 있다는 것을 압니까?

교차 유형 + 제네릭을 사용하십시오. 예 : 여기에서

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


답변

(기존 객체의 인터페이스 / 타입을 추출 할 수있는 연산자가 있습니까? 가능합니까?)

typeof 로 가야합니다 .

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

그것들을 병합하기 위해 이미 지적한 바사 랏으로 교차 작업을 사용할 수 있습니다.

type typeC = typeA & typeB


답변

Typescript 확산 연산자를 사용 하여 Javascript Object.assign ()로 변환합니다.

딥 트리 오브젝트 병합이 필요한 경우 최고의 글로벌 패키지 의 변경 기능을 사용할 수 있습니다.


답변

이 시도..

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};


답변