setTimeout
будет возвращать простой number
, а clearTimeout
будет принимать number | undefined
. И никаких проблем.)window.setTimeout
и window.clearTimeout
. var list = {
'[div]restored': 68,
'[div2]restored': 88,
'[mode]Easy [div]restored': 88,
'[mode]Normal [div]restored': 99
};
Object.entries(list).reduce((acc, [key, value]) => {
const keys = key
.split(/\[(.+?)\]/)
.map(k => k.trim().toLowerCase())
.filter(Boolean)
const last = keys.pop();
keys.reduce(
(sub, key) => sub[key] ?? (sub[key] = {}),
acc
)[last] = value;
return acc;
}, {});
SomeType extends BaseType
для аргумента функции, внутри функции значение этого аргумента просто BaseType
и автоматический вывод исходит из этого. Тут либо добавлять руками оверлоады и на враппер, или пробовать писать головоломный тип, или обойтись без оверлоадов явными условиями типа:type MyFuncAs =<T extends boolean> (obj?: Obj<T>) => T extends false ? number : string;
Grid
сделать тип IGridItemProps
с теми свойствами которые точно нужны для работы Grid
, а в GridItem
наследовать от него уже конкретную реализацию interface GridItemProps extends IGridItemProps { ... }
. Однако это нужно только если теоретически могут появиться ещё GridItemSuper
и GrigItemNice
, если же такого быть не может и модули(компоненты) сами по себе тесно связны, то заморачиваться не стоит. window.location.origin
на origin
целевого сайта. Если к нескольким, то либо заменить на звёздочку(*
), если вам добра не жалко, либо вызывать postMessage
несколько раз подряд, по одному для каждого домена.attachEvent
? Серьёзно? api.get(`files/${id}`, {
responseType: 'blob'
}).then((r) => {
const url = URL.createObjectURL(r.data);
// ...
null
ты должен сделать так, чтобы там не было null
. Довольно очевидно, да.const data = useSelector(state => state.DataState.Data) ?? defaultData;
Либо так:if (favorite && data) {
/(?<="reason":")([^"]+)/
или /(?<=\\"reason\\":\\")(.+?)(?=\\")/
в зависимости насколько кривая у вас там строка. Оно без вариантов свалится если в искомом слове будут кавычки. this
внутри function
зависит от контекста вызова этой function
.onAuthStateChanged
- вызывается переданная ему функция-обработчик, которой устанавливается какой-то this
(или не устанавливается, и тогда он по умолчанию window
или, в строгом режиме, undefined
). И этот this
точно никак не связан с текущим this
Vue, потому что тот никаким образом не передан при вызове, и, соответственно onAuthStateChanged
о нём ничего не знает.(async function(user) { ... }).bind(this)
чтобы жёстко привязать эту функцию к this
.vm.g = 5;
, т.к. таким образом конкретный this
сохранён в переменную и не меняется в зависимости от контекста вызова.async (user) => { ... }
, её механика работы по сути осуществляет неявный bind
.bind
всех методов к this:onAuthStateChanged(this.onAuthStateChanged)
methods: {
onAuthStateChanged: async function (user) { ... }
}