Typescript копировать свойства объекта используя forin - PullRequest
0 голосов
/ 31 октября 2018

Я пытаюсь скопировать свойства объекта, используя 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];
        }
    }
}

Здесь - образец на площадке для машинописи.

Спасибо!

1 Ответ

0 голосов
/ 31 октября 2018

Проблема в том, что тип this не Greeter, а полиморфный this тип . Печальным последствием является то, что i в вашем цикле for я набрал как 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]
            }
        }

    }
}
...