Как восстановить вложенный тип объекта после сужения типа?Javascript

Форум по Javascript
Ответить
Anonymous
 Как восстановить вложенный тип объекта после сужения типа?

Сообщение Anonymous »

Я использую веб -работники для моих тяжелых вычислений. Передача данных к работнику неявно выполняется путем сериализации объектов, поэтому их типы сужаются до простых объектов, что означает, что объект Foo определяется так:

Код: Выделить всё

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" } }
Таким образом, чтобы использовать метод SayHello , фактический тип должен быть восстановлен у работника, например, Используя конструктор: < /p>

Код: Выделить всё

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
}
Это хорошо работает для плоских классов, но вложенные типы по-прежнему сужаются до простых объектов, что означает, что функция SayHello в bar отсутствует, при вызове:

Код: Выделить всё

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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»