Код: Выделить всё
class Foo {
name: string
child: Bar
constructor(name: string, child: Bar) {
this.name = name
this.child = child
}
}
class Bar {
name: string
constructor(name: string) {
this.name = name
}
sayHello() {
console.log("Hello!")
}
}
< /code>
сужается до такого объекта, как это: < /p>
{ name: "foo", child: { name: "bar" } }
Код: Выделить всё
const newFoo = new Foo(other.name, new Bar(other.child.name)
< /code>
, который, как вы можете видеть, может стать очень многословным и вероятного источника ошибок.class Foo {
// ...
static from(other: Foo) {
const child = Bar.from(other.child)
return new Foo(other.name, child)
}
}
class Bar {
// ...
static from(other: Bar) {
return new Bar(other.name)
}
}
< /code>
Это может быть возможно, но также является очень словесным и подверженным ошибкам.function copy(obj: any, prototype: T): T {
if (!obj) return obj
const clone = Object.create(prototype)
Reflect.ownKeys(obj).forEach((key) => {
const desc = Object.getOwnPropertyDescriptor(obj as T, key)
if (desc) {
Object.defineProperty(clone, key, desc)
}
})
return clone as T
}
Код: Выделить всё
const fooFromObj = copy({ name: "foo", child: { name: "bar" } }, Foo.prototype)
< /code>
Потому что это создает этот объект: < /p>
Foo { name: "foo", child: { name: "bar" } }
// instead of:
Foo { name: "foo", child: Bar { name: "bar" } }
Подробнее здесь: https://stackoverflow.com/questions/797 ... -narrowing
Мобильная версия