使用for..in

时间:2018-10-31 16:06:16

标签: typescript extract

我正在尝试使用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是打字稿游戏场中的示例。

谢谢!

1 个答案:

答案 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]
            }
        }

    }
}