особенно если число параметров растет
седневной жизни мне нужно прочитать некоторые json из ajax и привести их к какому-либо типизированному объекту (включая его МЕТОДЫ). В интернете я нашел и использую следующий код для приведения типов:
export class Obj
{
public static cast<T>(obj, type: { new(...args): T} ): T
{
obj.__proto__ = type.prototype;
return obj;
}
}
В качестве примера это можно использовать следующим образом:
let objFromJson = { id: 666, name: "love" };
let building: Building = null;
building = Obj.cast(objFromJson, Building);
// On this point constructor for Building is not call - this is
// correct because we not create object but only make type casting
building.test('xx');
// on this point on console we should get:
// > "building.test a:xx, name:love"
// so object 'building' indeed have methods of Building Class
где (пример от 'головы')
export class Building {
constructor(
public id: number,
public name: string,
) {
console.log('building.constructor: id:' + id + ', name' + name);
}
public test(a) {
console.log('building.test a:' + a + ', name:' + this.name);
}
}
Дополнительная информация: вместо использованияcast<T>(obj, type: { new(...args): T} ): T
мы можем использовать толькоcast<T>(obj, type): T
но я читал, что вторая версия вызовет проблемы с функциями стрелок (https://stackoverflow.com/a/32186367/860099) - не понимаю почему -?
Вопросов: Я не очень понимаю, как работает метод Obj.cast (и, например, как я могу использовать...args
на вызов) - кто-нибудь может это объяснить? Кто-нибудь знает альтернативную функцию, но не для приведения, а для объекта CREATE (чтобы вызвать конструктор) формировать данные JSON аналогичным удобным способом (например,building = Obj.create(objFromJson, Building);