当前位置: 首页 > 知识库问答 >
问题:

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

松铭
2023-03-14

我想知道最好的方法,比如我有两个物体

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定义接口的方法。我不想为同一个属性写两次声明和定义/求值。如果我在一个对象上有太多的属性,这种冗余是很重要的。

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

可能吗?

共有3个答案

曹渝
2023-03-14

所以编译器/IDE 知道它同时具有对象 A 和对象 B 的属性?

使用交集类型泛型。例如从这里

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

江煜
2023-03-14

(是否有一个操作符可以提取现有对象的接口/类型?可能吗?)

你应该去类型。

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

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

type typeC = typeA & typeB
易宣
2023-03-14

看起来这应该能解决问题:

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); 
 类似资料:
  • 我有以下代码: 我遇到一个错误,指向.find并说: “字符串”类型的变量中不存在属性find。我知道错误在说什么,但是我如何将< code>$modal定义为一个我可以使用< code >的变量。查找于? 同样,现在我在typescript世界里,有没有更好的方法来定义modal,而不是在这里将它定义为var?

  • 我的代码: 错误消息来自TypeScript(3.0)编译器: TS2322:类型“string[]”不可分配给类型“[string, string, string, string, string, string, string]”。“string[]”类型中缺少属性“0”。 如果我将字符串[]更改为只读数组 TS2322:“ReadonlyArray”类型不能分配给类型“[string,stri

  • 组合对象的方法 您可以组合矢量对象,以在 Illustrator 中用各种不同的方式创建形状。生成的路径或形状会因为组合对象时所选用的方法而有所不同。 路径查找器效果 路径查找器效果可以让您使用交互模式来组合多个对象。使用路径查找器效果时,不能编辑对象之间的交互。请参阅使用路径查找器效果来组合对象。 复合形状 复合形状使您可以组合多个对象,并可指定每个对象与其他对象的交互方式。复合形状比复合路径更

  • 问题内容: 我正在获取一个json响应并将其存储在mongodb中,但是我不需要的字段也正在进入数据库中,是否仍要剥离unseccary字段? 输出: 问题答案: 您可以使用从给定对象中选取某些属性的函数: 然后:

  • 问题内容: npm软件包允许我们在TypeScript应用程序内部使用React。我们将组件定义为 在这里,我们必须声明组件属性和状态的类型(在类型变量中)。 在声明了这些类型之后,TypeScript将使用该类型来验证组件的用法(传递给它的道具的形状)。 我想围绕这样的组件创建一个容器。容器将重复使用组件的道具。但是,为了创建具有相同道具的另一个组件,我必须再次重新声明道具的类型。或从原始组件文

  • 问题内容: 这是我的json: 这是模型: 查询: 问题是强制转换为我期望属性后,但它是字符串。它不应该转换为Date对象吗?我在这里想念什么? 问题答案: @Gunter是绝对正确的。我唯一要添加的实际上是如何反序列化json对象,使其日期属性保持为日期而不是字符串(从引用的帖子中看到这种方法并不容易)。 这是我的尝试: 您可以在此处看到这种方法的示例:JSON.parse在dateRevive