TypeScript hasOwnProperty 等效项

Posted

技术标签:

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

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

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

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

【问题讨论】:

【参考方案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 6 的Object.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

【讨论】:

以上是关于TypeScript hasOwnProperty 等效项的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用 Object.prototype.hasOwnProperty.call(myObj, prop) 而不是 myObj.hasOwnProperty(prop)?

hasOwnProperty方法用法简介

Object.hasOwnProperty

hasOwnProperty具有多个属性

hasOwnProperty与isPrototypeOf

hasOwnProperty 具有多个属性