→  removeEventListener и bind правильное использование

published 02 November 2023

Метод bind у функции возвращает новую функцию, поэтому нельзя делать вот так:

function onClick() { console.log('hello kitty');}

button.addEventListener('click', onClick.bind(this));

button.removeEventListener('click', onClick.bind(this));

Отписки не произойдет, на выходе будет две разные функции, для отписки надо сделать так:

function onClick() { console.log('hello kitty');}

const onClickFn = onClick.bind(this);

button.addEventListener('click', onClickFn);

button.removeEventListener('click', onClickFn);

 →  Добавляем ноль при формировании даты

published 02 December 2020

Каждый сталкивался с задачей формирования даты в нужном формате из объекта

Date

Помимо такой вещи как добавить +1 к результату функции

getMonth

, необходимо для читаемости добавить 0, если месяц состоит из одной цифры. то есть январь - 1 должен выглядеть как ‘01’ (01.01.2022)

Сейчас в javascript у строки есть метод, который решает эту простую задачу на раз два, метод padStart.

Для того, чтобы добавить 0 нужно вызвать метод со следующими параметрами -

Typescript проверка значения на соответствие типу(string literal type)

published 02 December 2020

Когда хочется использовать литеральные типы(string literal types) вместо перечислений(enum), встает вопрос как проверить значение на соответствие типу в рантайме.

С версии Typescript 3.4 это сделать довольно просто.

  1. Объявляем массив с типами:
const typeList = ['type1', 'type2', 'type3'] as const;
  • as const запрет на изменение объекта
  1. Делаем типы на основе массива
type MyType = typeof typeList[number];

синтаксис

typeof typeList[number]

обозначает, что типами будут все значения массива, можно сделать тип только из одного значения

typeof typeList[1]
  1. теперь мы можем спокойно делать проверку на соответствие типа, без лишних движений:
typeList.includes(myValue);

 →  Angular router FAQ

published 01 December 2020

** Как включить trace роутера?**

Добавить опцию в рутовый модуль роутинга:

imports: [
    RouterModule.forRoot(
      routes,
      { enableTracing: true } // <-- debugging purposes only
    )
]

Set описание и хитрости

published 10 November 2020

Set это объект позволяющий хранить уникальные значения разных типов, примитивных типов или ссылок на объекты.

Set можно итерировать в порядке добавления элементов.

Хитрости с Set:

  • удаление повторяемых значений из массива
let uniqueArray = [...new Set([1, 2, 3, 3,3,"school","school",'ball',false,false,true,true])];
>>> [1, 2, 3, "school", "ball", false, true]
  • как превратить Set в массив?

использовать spread:

const setList = [...value];

использовать Array.from:

Array.from(set)

 →  Проблема запуска eslint в монорепозитории

published 28 October 2020

В монорепозитории с UI китом(stencil/typescript) столнулся с проблемой, что запуск eslint на весь репозиторий падает с ошибкой. Как запуск из консоли, так и запуск через husky.

Ошибка при запуске через husky:

./node_modules/.bin/eslint --fix was terminated with SIGABRT

Ошибка при запуске через консоль:

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory

Оказывается проблема, в том, что eslint пытается загрузить в себя все конфигурации проектов, и у него заканчивается память…

 →  Интересный способ сброса setTimeout и setInterval

published 22 October 2020

Если нам нужно отменить запуск setTimeout или setInterval, то обычно используем такую конструкцию:

const timeoutId = setTimeout(() => {}, 100);

clearTimeout(timeoutId);

Основное неудобство в запоминании timeoutId, но можно сделать ф-цию обертку, которая позволит нам избавиться от timeoutId:

function timer(cb, timeout) {
  const timeoutId = setTimeout(cb, timeout);
  return () => clearTimeout(timeoutId);
}
const destroyTimer = timer(()=> {}, 1000);

destroyTimer();

За счет сохранения timeoutId внутри функции за счет замыкания, нам можно забыть о timeoutId

Такой же трюк можно провернуть и с EventListener:

Как удалить все node_modules с компьютера

published 30 October 2019

Чтобы освободить место на компьютере от node_modules достаточно выполнить команду, в директории с папкой с проектами(в корне, крайне не рекомендую запускать!):

find . -type d -name 'node_modules' -prune | xargs -I% rm -rf %

Источник: https://marinintim.com/2019/node_modules

 →  Escaping Regexp Expression

published 02 March 2016

Перед тем как вставить искомую строку в match, на поиск совпадений, неплохо заэкранировать строку.

//escape regexp expression 
     function escapeRegExp(str) {
       return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&');
     }

Основные команды VIM

published 24 December 2014

Конвертировать табы в white-space, если все уже настроено:

:%retab
1 2 3 4 5 6 7 8 9 10 11 »