我正在尝试使用for..in复制对象的属性,但出现错误:
类型'Greeter [Extract]'不能分配给类型'this [Extract]'。
有什么办法解决这个问题吗?
class Greeter {
a: string;
b: string;
c: string;
// etc
constructor(cloned: Greeter) {
for (const i in this) {
if (cloned.hasOwnProperty(i)) {
this[i] = cloned[i];
}
}
}
Here是打字稿游戏场中的示例。
谢谢!
答案 0 :(得分:2)
问题在于this
的类型不是Greeter
,而是polymorphic this
type。不幸的结果是,您的for循环中的i
键入为keyof this
,而Greeting
可以使用keyof Greeting
进行索引。这些看起来似乎是同一回事,但是如果您认为可以派生Greeting
,则keyof this
可能包含更多的成员。类似的讨论适用于索引操作的值。
编译器没有错,this
的密钥可能比Greeter
多,因此并不是100%安全的。
最简单的解决方案是使用类型断言来更改this
的类型:
class Greeter {
a: string;
b: string;
c: string;
// etc
constructor(cloned: Greeter) {
for (const i in this as Greeter) {
if (cloned.hasOwnProperty(i)) {
this[i] = cloned[i]
}
}
}
}
或者您可以遍历cloned
对象:
class Greeter {
a: string;
b: string;
c: string;
// etc
constructor(cloned: Greeter) {
for (const i in cloned) {
if (cloned.hasOwnProperty(i)) {
this[i] = cloned[i]
}
}
}
}