Guest User

Untitled

a guest
Aug 12th, 2019
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.62 KB | None | 0 0
  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. Полная хуйня. Занавес.
Add Comment
Please, Sign In to add comment