Проблема в том, что тип 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]
}
}
}
}