javascript создание модели данных

169
22 сентября 2018, 15:20

Вопрос общий, о том как правильно делать.

В С# или Java я создаю модели для манипулирования данных. Например:

class Post
{
    public int id;
    public string title;
}

Тут же я могу задать дефолтные значения, и всегда знаю какие есть поля.

В js тоже есть классы, но мне не понятно как организовывать их структуру в проекте, и правильный ли это подход?

Пример проблемы:

Я получаю с сервера json такого вида

[
  {
    id:0,
    arr:['1','2']
  },
  {
    id:1,
  }
]

Теперь если я сделаю скажем так:

data[1].arr[0]//undefined 

то я получу ошибку. Ее не было бы если бы была модель которая описывать получаемые данные с дефолтными значениями.

Вопрос: как правильно решать такую проблему в js? Если классами, то как организовать проект(выносить каждый класс в отельный файл? А потом импортировать где нужно?). Может как то помочь в этом вопросе typescript?

Answer 1

class Smth { 
  constructor(info) { 
    this.id = info.id; 
    this.arr = info.arr || []; 
  } 
} 
 
var data = [{ 
  id:0, 
  arr:['1','2'] 
},{ 
  id:1, 
}]; 
 
data = data.map(x => new Smth(x)); 
 
console.log(data[1].arr.length);

Answer 2

1. вашу проблему можно решить со стороны сервера

Я получаю с сервера json такого вида

2. а можно со стороны клиента

если не нужна проверка типов то проще сделать так:

const user = { 
    login: null, 
    password: null, 
    age: null, 
    avatar: null, 
} 
 
let serverResponce = { 
    user: { 
        login: 'qwa', 
        avatar: 'htttp://', 
    } 
} 
 
let nUser = Object.assign({}, user, serverResponce.user) 
console.log(nUser) 
//{login: "qwa", password: null, age: null, avatar: "htttp://"}

3. TypeScript

считается что TypeScript С#'ам ближе чем JS'ам и если не пугает:

© Чего на самом деле не хватает? Нормального pattern matching-а, ну и иногда тоска накатывает из-за отсутствия typesafety. Но в такие моменты я обычно вспоминаю def myFunc[A, B >: C, E:A, D / E](a: A, b:B, c:C, d;D, e: E): [A / E] и как-то легче становится :)

смотри https://www.typescriptlang.org/docs/handbook/decorators.html ключевые слова reflect-metadata @validate

tsconfig.json

{
    "compilerOptions": {
        "target": "ES5",
        "experimentalDecorators": true,
        "emitDecoratorMetadata": true
    }
}

ещё ссылок

  • https://github.com/typeorm/typeorm
  • https://github.com/typeorm/typescript-example
  • https://github.com/typestack/routing-controllers

и не забываем, что любая проверка типов это небольшая, но работа (не хочу писать замедление)

UPD: ещё можно поискать что-либо на тему JSON валидации, но это выглядит более фантастично, чем проброс типов в JS из TS

READ ALSO
Сворачивание\разворачивание таблицы

Сворачивание\разворачивание таблицы

Реализовано сворачивание\разворачивание таблицы при нажатии на кнопкуПочему первая таблица работает как надо, а ее копия ниже не работает?...

136
Удаление непечатаемых символов JS RegExp

Удаление непечатаемых символов JS RegExp

Всем привет! Столкнулся с интересной задачей: имеется строка, в которой могут содержаться непечатаемые символы(пробел, перевод каретки, табуляция...

126
map по id инпутов

map по id инпутов

Функция не работаетВероятнее всего, ошибка в объявлении input

150
delay на смену заголовка

delay на смену заголовка

Пожалуй, это глупый вопрос, но почему-то не получается разобратьсяЕсть такая интересная маленькая и хрупкая библиотека i miss you: https://github

167