Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Пьеса "Как Тайпскрипт встретил Рантайм и его реалии".
- Сценарий.
- abstract class AbstractUser {
- constructor(
- public id: number|undefined = undefined,
- public name: string = ""
- ) {}
- }
- class CommonUser extends AbstractUser {}
- new CommonUser(); //=> {id:undefined,name:""}
- Погнали.
- Акт 1. Десереализация.
- let json = window.fromApiBlaBla(); //<= string '{"id":1488}'
- let dvacher = Object.assign(new CommonUser(), JSON.parse(json)); //=> CommonUser {id: 1488, name: ""}
- Окей. А если?
- let json = window.fromApiBlaBla(); //<= string '{"id":null}' <-- Засада
- let dvacher = Object.assign(new CommonUser(), JSON.parse(json)); //=> CommonUser {id: null, name: ""} <-- null пробрался туда,где его не ожидают! В рантайме! Тысяча чертей!
- "Изделие каучуковое №2".
- class NormalizedUser extends CommonUser {
- private _id: number|undefined = undefined;
- get id(): number|undefined {
- if (this._id === undefined || lodash.isNumeric(this._id)) {
- return this._id;
- }
- throw "Кто-то пробрался через нашу защиту!!!";
- }
- set id(value: number|undefined) {
- if (value === undefined) {
- this._id = value;
- }
- if (lodash.isNumeric(Number(value))) {
- this._id = Number(value);
- }
- //остальные типы пропускаем
- }
- private _name: string = "";
- get name(): string {
- return String(this._name);
- }
- set name(value: string) {
- this._name = String(value);
- }
- }
- let json = window.fromApiBlaBla(); //<= {"id":null}
- let dvacher = Object.assign(new NormalizedUser(), JSON.parse(json)); //=> {_id: undefined, _name: ""} <-- Ах, ПОДЧЕРКИВАНИЯ... Но хотя бы геттеры-сеттеры работают.
- Акт 2. Сериализация.
- let dvacher = new NormalizedUser();
- dvacher.id = 1488; //=> setter ~> _id = 1488
- dvacher.name = "Semen"; //=> setter ~> _name = "Semen"
- Збс.
- let json = JSON.stringify(dvacher); //=> {"_id":1488,"_name":"Semen"} FFFFUUUUUUUUUUUUUUUUUUUUUUUUUU~~
- Костыль.
- -> class ToJsonCommonUser extends AbstractUser {
- constructor(user: AbstractUser) {
- super();
- this.id = user.id; // обязаны быть по наследству
- this.name = user.name; // будут браться из геттеров
- }
- }
- class CommonUser extends AbstractUser {
- -> toJSON() { return new ToJsonCommonUser(this); }
- }
- let json = JSON.stringify(dvacher); //=> {"id":1488,"name":"Semen"}
- Полная хуйня. Занавес.
Add Comment
Please, Sign In to add comment