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.keys
或this.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)?