Все сервисы Хабра

Сообщество IT-специалистов

Ответы на любые вопросы об IT

Профессиональное развитие в IT

Удаленная работа для IT-специалистов

Войти на сайт
  • Все вопросы
  • Все теги
  • Пользователи

Хабр Q&A — вопросы и ответы для IT-специалистов

Получайте ответы на вопросы по любой теме из области IT от специалистов в этой теме.

Узнать больше
другие проекты хабра
  • Хабр
  • Карьера
  • Фриланс
Задать вопрос

Руслан Лопатин

  • 168
    вклад
  • 0
    вопросов
  • 224
    ответа
  • 34%
    решений
Ответы
  • Информация
  • Ответы
  • Вопросы
  • Комментарии
  • Подписки
  • Нравится
  • Достижения
  • Как скомпилировать несколько файлов в разных директориях и результат компиляции так же разложить по разным директориям?

    Руслан Лопатин @lorus
    Для таких вещей сборщики используются.

    Например, Rollup или Vite.
    Ответ написан более двух лет назад
    2 комментария
    2 комментария
  • Как правильно отписываться от подписок в Angular?

    Руслан Лопатин @lorus
    Лучше вот так:
    this.authService.getUuid().pipe(
      switchMap(phraseFromServer => this.authService.sendPhraseToPlugin()),
      untilDestroyed(this),
    ).subscribe(signedCert => {
      this.signedCert = signedCert;
    })
    Ответ написан более двух лет назад
    1 комментарий
    1 комментарий
  • Какова сложность алгоритмов (Big(O)) встроенных JS методов?

    Руслан Лопатин @lorus
    Представление строк в разных JS движках разное.

    В V8 строка может быть представлена как массив или как дерево. При конкатенации строк как раз используется дерево. Есть даже проект flatstr, который конвертирует древообразное представление в плоское, чтобы прочие операции над строкой выполнялись быстрее.
    Ответ написан более двух лет назад
    Комментировать
    Комментировать
  • Почему при сборке вылезает ошибка "Did you forget to signal async completion"?

    Руслан Лопатин @lorus
    exports.build = build();
    Ответ написан более двух лет назад
    13 комментариев
    13 комментариев
  • Почему gulp uglify выдаёт ошибку?

    Руслан Лопатин @lorus
    Используйте terser вместо давно устаревшего uglify.
    Ответ написан более трёх лет назад
    1 комментарий
    1 комментарий
  • Как починить readonly- NTFS из-под Linux Mint без форматирования дисков и риска потери данных на них?

    Руслан Лопатин @lorus
    На машинах с двойной загрузкой такое случается, если Windows не завершила работу корректно. Например, если вместо выключения ушла в гибернацию.

    Если это ваш случай, то достаточно загрузить Windows, а затем выключить её соответствующим пунктом в стартовом меню. После этого диск примонтирутся в Linux как надо.
    Ответ написан более трёх лет назад
    1 комментарий
    1 комментарий
  • Почему TS не может определить интерфейс и типизировать переменные?

    Руслан Лопатин @lorus
    Ну так и что вам не понятно? У вас Object испольуется там, гле ожидается Movie. Либо сделайте Resp.results типа Movie[], либо не приводите результат fetch к типу Resp
    Ответ написан более трёх лет назад
    1 комментарий
    1 комментарий
  • Почему нет ошибки при использовании intersection типа?

    Руслан Лопатин @lorus
    А это и не ошибка вовсе. В переменную типа type1 | type2 можно назначить значение типа type1 или типа type2. Ваше значение вполне соответствует типу type2, так что всё в порядке. Что до "лишнего" свойства "a", то его наличие, строго формально, - не ошибка. Теоретически там может быть любое дополнительное поле. Но TypeScript не допускает такого, для предотвращения _человеческих_ ошибок. Это что-то типа linting, Хотя строго формально, как я уже сказал, - это не ошибка.
    Вот соответствующий комментарий.
    Ответ написан более трёх лет назад
    2 комментария
    2 комментария
  • Какая логика работы intersection и union типов?

    Руслан Лопатин @lorus
    Вы неправильно поняли. Просто читайте | как "или", а & - как "и".

    number | string значит, что переменная содержит либо число, либо строку.

    number &string значит, что переменая будет и числом и строкой одновременно. И не важно, как это реализовано, и реализуемо ли в принципе (нет).
    Ответ написан более трёх лет назад
    1 комментарий
    1 комментарий
  • Почему тип never у пустого массива?

    Руслан Лопатин @lorus
    Вот соответствующий баг. А вот объяснение почему это не баг.

    В общем случае пустой массив имеет тип never[]. Но в простом случае TypeScript умеет выводить тип изначально пустого массива по последующим операциям над ним. Типа push.

    Так что реально тип test1 из вашего примера станет string[], как только будет "зафиксирован". Например, возвращён из функции или назначен в другую переменную.

    Так что следующий код будет работать:
    function buildArray() {
      const test1 = []; // тут будет any[]
      test1.push('str');
      test1.push(1);
    }
    const array = buildArray(); // тип (string | number)[]

    А вот такой - уже нет
    const test1 = []; // тут будет any[]
    test1.push('');
    const test2 = test1;
    test2.push(2); // Argument of type '2' is not assignable to parameter of type 'string'.
    Ответ написан более трёх лет назад
    2 комментария
    2 комментария
  • Как изучить Maven?

    Руслан Лопатин @lorus
    Maven: The Complete Reference
    Ответ написан более трёх лет назад
    Комментировать
    Комментировать
  • Как правильно тестировать функции, манипулирующие DOM-элементами?

    Руслан Лопатин @lorus
    mocha-jsdom
    Ответ написан более трёх лет назад
    4 комментария
    4 комментария
  • Как конкретизировать сложный тип?

    Руслан Лопатин @lorus
    TypeScript так не умеет.

    Могу предложить нормализацию сложных типов. Что-то типа такого:
    // Заготовка для Some
    interface SomeDraft {
      value?: string | string[]; // Массив или значение. Может отсутствовать.
    }
    
    // Some имеет более строгий тип и как можно меньшую вариативность,
    // чтобы в коде не делать проверки.
    interface Some {
      value: string[];  // Всегда присутствует. Всегда массив.
    }
    
    function makeSome({ value = [] }: SomeDraft): Some {
      // Приводим к нормальному (более строгому) типу
      return {
        value: Array.isArray(value) ? value : [value],
      };
    }
    
    // Здесь Some задаётся через заготовку - так проще задавать значения
    // Но результат всегда более строгий - так проще значениями пользоваться
    const foo = makeSome({ value: 'foo' }); // { value: ['foo'] }
    
    foo.value.map(() => {}); // foo.value - всегда массив и TypeScript это знает
    Ответ написан более трёх лет назад
    6 комментариев
    6 комментариев
  • Почему не работает Wi-Fi на ноутбуках?

    Руслан Лопатин @lorus
    Ограничения скорости в самих маршрутизаторах? Типа органичений для незарегистрированных устройств в Zyxel
    Ответ написан более трёх лет назад
    Комментировать
    Комментировать
  • Каким должен быть конечный файл npm пакета?

    Руслан Лопатин @lorus
    Не нужно лишние зависимости типа core-js запихивать в конечный файл. Там должен быть только код библиотеки. Зависимости потребитель вашего пакета добавит и так. Просто добавьте их в peerDependencies.

    У rollup есть опция external для этого.

    Чтобы вспомогательные функции не добавлялись в конечный файл, в tsconfig нужно добавить опции "importHelpers": true, "noEmitHelpers": true, а в зависимости пакета - добавить tslib.

    Если этого не делать, то может так случиться, что одни и те же зависимости будут добавлены в конечное приложение несколько раз.
    Ответ написан более трёх лет назад
    6 комментариев
    6 комментариев
  • Как видоизменить функцию каррирования?

    Руслан Лопатин @lorus
    Можно использовать valueOf вместо toString.
    Тогда с результатом можно будет обращаться как с числом, хотя это и будет функция.
    Ответ написан более трёх лет назад
    Комментировать
    Комментировать
  • Список (ul) пирамидкой без костылей и JavaScript (ну или с ним в крайнем случае)?

    Руслан Лопатин @lorus

    Работает только в Firefox
    Ответ написан более трёх лет назад
    Комментировать
    Комментировать
  • Можно ли написать функцию isset в javascript?

    Руслан Лопатин @lorus
    Такая проверка выполняется проще: myVar != null
    Ответ написан более трёх лет назад
    3 комментария
    3 комментария
  • Нужно ли добавлять в .gitignore package-lock.json?

    Руслан Лопатин @lorus
    Согласно официальной документации package-lock.json предназначен быть в репозитории, чтобы все разработчики проекта работали с одним и тем же набором зависимостей.

    Относительно того, что его не нужно включать в код библиотек - неправда:
    • Во-первых, когда выполняется npm publish, package-lock.json автоматически исключается из опубликованного пакета (проверьте командой npm archive, например)
    • А во-вторых, package-lock.json используется только в корне проекта. В зависимостях он игнорируется. То есть в директории node_modules/your-dependency он может присутствовать невозбранно.


    Ответ на ваш вопрос: никогда не добавляйте package-lock.json в .gitignore
    Ответ написан более трёх лет назад
    4 комментария
    4 комментария
  • Как передать данные, в динамически созданный iFrame с помощью postMessage?

    Руслан Лопатин @lorus
    А вы уверены, что iframe уже прогрузился в момент, когда туда отправляется сообщение? И что туда загрузился именно нужный документ, а, например, не ERROR 404?

    Наиболее надёжный способ убедиться в том, что фрейм готов получать сообщения - это послать сообщение из фрейма родителю после того, как он зарегистрировал onmessage у себя. И только после этого отправлять сообщения из родителя в iframe. До этого момента их, например, можно накапливать в буфере.
    Ответ написан более трёх лет назад
    1 комментарий
    1 комментарий
Оценили как «Нравится»
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • Следующие →
Самые активные сегодня
  • dimonchik2013
    Dimonchik
    • 9 ответов
    • 0 вопросов
  • vabka
    Василий Банников
    • 6 ответов
    • 0 вопросов
  • vpetrov
    Виктор Петров
    • 6 ответов
    • 0 вопросов
  • saboteur_kiev
    Saboteur
    • 4 ответа
    • 0 вопросов
  • pindschik
    pindschik
    • 4 ответа
    • 0 вопросов
  • CityCat4
    CityCat4
    • 4 ответа
    • 0 вопросов
  • © Habr
  • О сервисе
  • Правила
  • Обратная связь
  • Блог

Войдите на сайт

Чтобы задать вопрос и получить на него квалифицированный ответ.
Войти через центр авторизации