TypeScript的hasOwnProperty等价方法

34

如果我想在JavaScript中循环遍历一个字典,并设置另一个字典的属性,我会使用类似于以下的代码:

```javascript for (var key in dict) { otherDict[key] = dict[key]; } ```
for (let key in dict) {
  if (obj.hasOwnProperty(key)) {
    obj[key] = dict[key];
  }
}

如果obj是一个TypeScript对象(类的实例),是否有一种执行相同操作的方法?

4个回答

35
如果 obj 是一个 TypeScript 对象(类的实例),是否有一种方法执行相同的操作?
你的 JavaScript 是有效的 TypeScript(了解更多)。因此,您可以直接使用相同的代码。
以下是一个示例:
class Foo{
    foo = 123
}

const dict = new Foo();
const obj = {} as Foo;

for (let key in dict) {
  if (obj.hasOwnProperty(key)) {
    obj[key] = dict[key];
  }
}

注意:我建议即使在JavaScript中也使用Object.keys(obj).forEach(k =>,但这不是你在这里询问的问题。

4
关于这个问题,我有一个次要的问题;在您的情况下,您初始化了foo属性,这确保它存在于生成的js代码中;但是如果该属性未定义,则它根本不属于生成的代码。您知道为什么会这样吗?当我尝试在某个实例上使用hasOwnProperty时,结果返回false,尽管我期望它存在但未定义,这让我感到有些惊讶。 - dSebastien
3
让我们考虑未定义的属性,即在 TypeScript 类 A { prop1:string, prop2:number} 中定义的所有属性都不会被 Object.keysthis.hasOwnProperty(k) 枚举,因为自动生成的 JavaScript 对这些属性没有了解。 - loretoparisi
7
为什么你会推荐使用 Object.keys(obj).forEach(k=> 而不是 for() 循环? - Coo

4

0

0

你可能只需要使用ECMAScript 6Object.assign(obj, dict);

TypeScript的展开运算符也许会想到,但我认为它不适用,因为它是用于创建一个新对象,而你想要覆盖现有中的属性。

需要注意的是,这只是一个浅拷贝,并且如果目标类中存在setter,则会调用它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接