Как объединить свойства объекта в 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. Я не хочу писать декларацию и определение/оценку для одного и того же свойства дважды. Эта избыточность значительна, если у меня слишком много свойств для объекта.
(Есть ли оператор, который может извлечь интерфейс/тип существующего объекта?)
Возможно ли это?
Ответы
Ответ 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