Задать вопрос
  • Как должна выглядеть структура json, которую можно выводить с конц, можно обращаться по номеру и удалять?

    Aetae
    @Aetae Куратор тега JavaScript
    accountnujen, очевидно - да. Иначе - хранить все записи в двух видах: в виде массива и в виде объекта, работая одновременно с двумя. Либо использовать Map у которой есть forEach, либо сделать итератор на основе объекта, либо каждый раз таки преобразовывать в массив.
    Забавный(на самом деле отвратительный) факт: числовые ключи объекта в js всегда идут первыми и в отсортированом виде, все остальные - по мере добавления: Object.keys({2:0, 3:0, 1:0}) // ['1', '2', '3'], возможно этот факт тебе чем-то поможет.
  • Как должна выглядеть структура json, которую можно выводить с конц, можно обращаться по номеру и удалять?

    Aetae
    @Aetae Куратор тега JavaScript
    accountnujen,
    ну вот нихрена не так.
    а ты руками замерь. Хз что у них там на самом деле значат ops/sec.
    Ну и естественно наполнение всего массива через unshift - неоптимально. А вот добавить один элемент в уже имеющийся массив от push неотличимо.

    хотя вид классов не интуитивно понятный этому не способствует


    Что тут непонятного то?
    class DB {
      constructor(json) {
        // начальная подготовка структуры
      }
    
      toJSON() {
        // экспорт структуры для сохранения
      }
    
      reversed() {}
    
      reversedIterator() {}
    
      byTag(tag) {}
    
      byTagIterator(tag) {}
    
      add(record) {}
    
      get(id) {}
    
      delete(id) {}
    }
  • Как должна выглядеть структура json, которую можно выводить с конц, можно обращаться по номеру и удалять?

    Aetae
    @Aetae Куратор тега JavaScript
    Ты для микрокотролера пишешь? Просто иначе производительность unshift как и большинства иных операций - в пределах погрешности для миллионов записей перебираемых миллион раз в секунду.:)

    В целом задача решается через класс: создаёшь класс, в нём методы которые делают именно нужные тебе операции, а уж реализацию внутри самих методов можешь писать любой замороченности(хранить копии в разной структуре, кэширование и т.д.) - тебе её надо написать только один раз, а дальше будешь пользоваться простыми и очевидными методами класса, абстрагировавшись от внутренней сложности.
  • В каких случаях используют as keyof typeof?

    Aetae
    @Aetae Куратор тега TypeScript
    Лол, мужик, совет был не:
    const isPosts = (posts: unknown): posts is Posts => !!posts 
      && typeof posts === 'object'

    а:
    const isPosts = (posts: unknown): posts is Posts => !!posts 
      && typeof posts === 'object' 
    //&& ...

    Подразумевалось, что в дополнительной проверке, ты проверяешь руками, что у тебя именно объект типа Posts, а не "какой-то объект" и вообще не какая-то неведомая хрень.
    Эта проверка должна гарантировать, что любые обращения к полученным данным не приведут к ошибке из-за того что данные на самом деле не соответствуют Posts.
  • Почему глючат картинки в мобильном браузере?

    Aetae
    @Aetae
    Странно, но тогда есть два более разумных решения, которые можно попробовать, чем таймер:
    1. Заменить onloadend на классический onload.
    2. Поменять местами картинка.src = и картинка.onload = - возможно событие отрабатывает прямо при присваивании, т.к. ничего грузить не надо(хотя и те должно бы).
  • Почему глючат картинки в мобильном браузере?

    Aetae
    @Aetae
    alexalexes, не мешайте человеку самовыражаться.:)
    Он либо сам дорастёт( а может и уже дорос и перерос:) ) до понимания, что кириллице и snake_case в js коде не место, а египетские скобки и точки с запятой - наоборот обязательны, либо это уже не будет иметь значения.
  • Как вывести в git log пересечения коммитов двух веток?

    Aetae
    @Aetae
    Если разработка ведётся только в дев ветках, то сравнивай dev/2.5 с 2.6, в чём вопрос?)
  • Как бэкапнуть банковское приложение на андроиде, не теряя вход?

    Aetae
    @Aetae
    В теории - можно, на практике - нет. (Потребуются несоразмерные усилия инженеров высокого уровня.)
  • Как использовать router и ajax запросы?

    Aetae
    @Aetae Куратор тега Vue.js
    Роутер ничего магически не сохраняет. Тыкнул "назад" - просто перезагрузились компоненты связанные с url.
  • Почему при подключении компонента при отрисовки выдает ошибку?

    Aetae
    @Aetae Куратор тега Vue.js
    Евгений, сделай в Modal1 console.log(Modal2). Возможно у тебя алиасы криво настроены.:)
  • Как правильно инкрементировать переменную в javaScript?

    Aetae
    @Aetae Куратор тега JavaScript
    My1Name, переменные - просто переменные, без каких либо данных о типе, в них может лежать что угодно(или не лежать - undefined). То что ты сделаешь let num = 0; не помешает тебе далее по коду сделать num = { foo: 'bar' } или даже num = funcion() {}.
    Для оптимизации движки-интерпретаторы конечно угадывают и предполагают типы на лету, но это особенности реализации, а не самого языка.
  • WebSocket connection to 'wss://localhost:12345/' failed в чем ошибка?

    Aetae
    @Aetae Куратор тега JavaScript
    hjsdfd, чувак не стоит светить тут(и нигде) своим PRIVATE KEY.

    В остальное лень вникать, но для начала вместо 12345 попробуй использовать какой-нить стандартный порт, некоторые нестандартные порты могут быть запрещены и\или резаться по разным причинам.
  • Почему при подключении компонента при отрисовки выдает ошибку?

    Aetae
    @Aetae Куратор тега Vue.js
    Всё написано в ошибке.

    Если нужно что-то ещё - покажи код Modal2 и как ты пытаешься его подключить в Modal1.
  • Как правильно инкрементировать переменную в javaScript?

    Aetae
    @Aetae Куратор тега JavaScript
    My1Name, и это всё логично если подумать: js не типизированый язык. Когда ты где-то делаешь int foo - то тут foo заведомо int, можно по умолчанию сделать 0, когда же ты в js делаешь let bar - тут совершенно непонятно что за значение там будет, потому по умолчанию там специальное значение undefined.
  • Как типизировать вложенного объекта в объекте в одну строку?

    Aetae
    @Aetae Куратор тега TypeScript
    Boris007, рабочее то рабочее, вполне обычное, как и первое из решений в ответе, но если по серьёзному - не надёжное. Если ты доверяешь серверу, что с него придёт всегда то, что надо, и доверяешь себе, что в props.name будет только то, что придёт с сервера - то можно забить и так и писать.

    Иначе нужно второе решение из ответа: тайпгард, который проверит входные данные с гарантией. Так как тайпскрипт работает только на этапе компиляции, то на этапе исполнения, когда придут данные от api - никаких типов уже не будет, и вся надежда только на ручную функцию проверки.
    Существуют всякие библиотеки для проверки данных по схеме(zod и др.) или генрации проверки на основе типа (typia и др.), но обычный подход - забить и верить в лучшее.:)
  • Как типизировать вложенного объекта в объекте в одну строку?

    Aetae
    @Aetae Куратор тега TypeScript
    Boris007, ну какбэ по английски же написано: "строка" не может быть использована как индекс в типе
    { 
      'story': { 
        header: string; 
        page: { 
          tag: string; 
          image_src: string; 
          image_alt: string; 
        }[]; 
      }; 
    }


    У данного типа есть только один конкретный ключ - "story". Соответственно ты не можешь обращаться к нему никак иначе чем через blogPosts.story(blogPosts["story"]).
    Чтоб это работало, в props.name должен лежать тип "story", а не string.
    Это сделано как раз чтоб ты не получил undefined при этом уверенно думая, что у тебя там Post.

    Указывая же руками тип
    type Posts = {
        [key: string]: Post
    }
    ты говоришь тайпскрипту "при обращении по любому строковому ключу мне гарантировано вернётся Post". Т.е. ты снимаешь с тайпскрипта ответственность и берёшь её на себя.
  • Как типизировать вложенного объекта в объекте в одну строку?

    Aetae
    @Aetae Куратор тега TypeScript
    Лол, вот нахрена ты обрезал единственную инфу имеющую значение в рамках вопроса, а именно изначальный тип blogPosts:
    Element implicitly has an 'any' type because expression of type 'string' can't be used to index type <какой бъ?!>
  • Как правильно ограничивать передаваемые аргументы классов в TypeScript?

    Aetae
    @Aetae Куратор тега TypeScript
    OrbiJ, ещё в ответе я указал на библиотеку которая генерирует рантайм проверки на основе типов, для тех кому это важно. И таких там не одна. Есть и для классов, и для баз данных и всего такого. Но в целом они не особо популярны.

    А так - 99% фронта тупо верит серверу, что он пришлёт то, что заявил, без заморочек:).
    Когда же ты уже получил класс из неведомой хрени, то можешь спокойно проверять instanceof и т.п.
  • Как правильно ограничивать передаваемые аргументы классов в TypeScript?

    Aetae
    @Aetae Куратор тега TypeScript
    OrbiJ,
    Вообще хоть какой-то способ получить аргументы конструктора класса User есть?

    В рантайме - нет.

    Аргументы конструктора с точки зрения js - это просто аргументы метода с имением constructor. Метод с точки зрения js - это просто функция. Имена аргументов функции ни на что снаружи не влияют, и просто являются по сути мапингом по порядку в переменные внутри функции. Имена аргументов функции никак не доступны - точно также, как недоступны поля класса. Единственное что доступно - поле length функции содержащее количество аргументов(но и оно не учитывает, не может учитывать, ...spread параметры или использование arguments).

    // На самом деле есть один единственный вариант получить имена аргументов в рантайме: сделать Ctor.toString() и спарсить их из полученной текстовой репрезентации. Только вид этой текстовой репрезентации ничем не гарантирован(хоть и на данный момент вроде идентичен средь браузеров) и применять такое в проде нельзя.:)

    На этапе компиляции стандартными средствами - нет.

    На этапе компиляции вмешиваясь в сам процесс компиляции, выполняя дополнительные преобразования? Сколько угодно, каким угодно способом. Просто надо глубоко разобраться в работе собственно компилятора. :)
    Ну или использовать готовую либу с близким функционалом.
  • Как правильно ограничивать передаваемые аргументы классов в TypeScript?

    Aetae
    @Aetae Куратор тега TypeScript
    OrbiJ, проблемы с 4 пунктом.
    a) У AxiosResponse поле data имеет неизвестный тип. По умолчанию и для удобства - any, но на самом деле хрен знает, что там с сервера пришло. Нет там никакого constrictor точно, потому, что если и придёт там объект - это будет простой примитивный объект.
    б) Как я сказал выше:
    В javascript нет механизма получения полей класса

    Тебе просто не с чем сравнивать.

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