SHARE
TWEET

Untitled

a guest Aug 12th, 2019 24 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Пьеса "Как Тайпскрипт встретил Рантайм и его реалии".
  2.  
  3. Сценарий.
  4.  
  5. abstract class AbstractUser {
  6.     constructor(
  7.         public id: number|undefined = undefined,
  8.         public name: string = ""
  9.     ) {}
  10. }
  11.  
  12. class CommonUser extends AbstractUser {}
  13.  
  14. new CommonUser(); //=> {id:undefined,name:""}
  15.  
  16. Погнали.
  17.  
  18. Акт 1. Десереализация.
  19.  
  20. let json = window.fromApiBlaBla(); //<= string '{"id":1488}'
  21. let dvacher = Object.assign(new CommonUser(), JSON.parse(json)); //=> CommonUser {id: 1488, name: ""}
  22.  
  23. Окей. А если?
  24.  
  25. let json = window.fromApiBlaBla(); //<= string '{"id":null}' <-- Засада
  26. let dvacher = Object.assign(new CommonUser(), JSON.parse(json)); //=> CommonUser {id: null, name: ""} <-- null пробрался туда,где его не ожидают! В рантайме! Тысяча чертей!
  27.  
  28. "Изделие каучуковое №2".
  29.  
  30. class NormalizedUser extends CommonUser {
  31.     private _id: number|undefined = undefined;
  32.     get id(): number|undefined {
  33.         if (this._id === undefined || lodash.isNumeric(this._id)) {
  34.             return this._id;
  35.         }
  36.        
  37.         throw "Кто-то пробрался через нашу защиту!!!";
  38.     }
  39.     set id(value: number|undefined) {
  40.         if (value === undefined) {
  41.             this._id = value;
  42.         }
  43.         if (lodash.isNumeric(Number(value))) {
  44.             this._id = Number(value);
  45.         }
  46.         //остальные типы пропускаем
  47.     }
  48.    
  49.     private _name: string = "";
  50.     get name(): string {
  51.         return String(this._name);
  52.     }
  53.     set name(value: string) {
  54.         this._name = String(value);
  55.     }
  56. }
  57.  
  58. let json = window.fromApiBlaBla(); //<= {"id":null}
  59. let dvacher = Object.assign(new NormalizedUser(), JSON.parse(json)); //=> {_id: undefined, _name: ""} <-- Ах, ПОДЧЕРКИВАНИЯ... Но хотя бы геттеры-сеттеры работают.
  60.  
  61. Акт 2. Сериализация.
  62.  
  63. let dvacher = new NormalizedUser();
  64. dvacher.id = 1488; //=> setter ~> _id = 1488
  65. dvacher.name = "Semen"; //=> setter ~> _name = "Semen"
  66.  
  67. Збс.
  68.  
  69. let json = JSON.stringify(dvacher); //=> {"_id":1488,"_name":"Semen"} FFFFUUUUUUUUUUUUUUUUUUUUUUUUUU~~
  70.  
  71. Костыль.
  72.  
  73. -> class ToJsonCommonUser extends AbstractUser {
  74.     constructor(user: AbstractUser) {
  75.         super();
  76.         this.id = user.id; // обязаны быть по наследству
  77.         this.name = user.name; // будут браться из геттеров
  78.     }
  79. }
  80.  
  81. class CommonUser extends AbstractUser {
  82.     -> toJSON() { return new ToJsonCommonUser(this); }
  83. }
  84.  
  85. let json = JSON.stringify(dvacher); //=> {"id":1488,"name":"Semen"}
  86.  
  87. Полная хуйня. Занавес.
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top