【问题标题】:TypeScript hasOwnProperty equivalentTypeScript hasOwnProperty 等效项
【发布时间】:2016-06-12 00:54:44
【问题描述】:

在 JavaScript 中,如果我想遍历一个字典并设置另一个字典的属性,我会使用这样的东西:

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

如果obj 是 TypeScript 对象(类的实例),有没有办法执行相同的操作?

【问题讨论】:

    标签: javascript object typescript typescript1.8


    【解决方案1】:

    如果 obj 是 TypeScript 对象(类的实例),有没有办法执行相同的操作?

    您的 JavaScript 是有效的 TypeScript (more)。所以你可以使用和原来一样的代码。

    这是一个例子:

    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=>,但这不是您在这里要问的问题。

    【讨论】:

    • 我对此有一个附带问题;在您的情况下,您初始化 foo 属性,以确保它存在于生成的 js 代码中;尽管如果未定义该属性,则它根本不是生成代码的一部分。你知道这是为什么吗?当我尝试在某个实例上使用 hasOwnProperty 并得到错误回复时,这让我有点惊讶,尽管我希望它存在但未定义。
    • 让我们考虑未定义的属性,即在打字稿class A { prop1:string, prop2:number} 中定义的所有属性都不会被Object.keysthis.hasOwnProperty(k) 枚举,因为自动生成的javascript 不知道这些属性。
    • 为什么你会推荐 Object.keys(obj).forEach(k=> 而不是 for()
    【解决方案2】:

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

    TypeScript's spread operator 浮现在脑海中,但我认为它不适用,因为那是为了创建一个新对象,你想覆盖现有中的属性。

    需要注意的是它只是一个浅拷贝,如果存在,它将调用目标类中的 setter。

    【讨论】:

      【解决方案3】:

      我发现 fp-ts has 函数最适合我的用例:

      const role = 'mother' as string
      const rolesConst = {
        mother: 'mother',
        father: 'father'
      } as const
      if (has(role, rolesConst)) {
        // role's type is 'mother' | 'father'
      }
      

      https://gcanti.github.io/fp-ts/modules/ReadonlyRecord.ts.html#has

      【讨论】:

        猜你喜欢
        • 2019-02-07
        • 1970-01-01
        • 1970-01-01
        • 2017-07-31
        • 2020-06-25
        • 2020-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多