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) { ... }
} const RunOutsideAngular = (target: any, memberName: string) => {
const method = target[memberName];
return Object.defineProperty(target, memberName, {
writable: true,
configurable: true,
value(...args: any[]) {
return this.ngZone.runOutsideAngular(method.bind(this, ...args))
}
});
};
const RunOutsideAngularAll = (constructor: Function) => {
const keys = new Set<string>();
let proto = constructor.prototype;
do {
if(proto === Object.prototype) break;
Object.getOwnPropertyNames(proto).forEach(
key => typeof proto[key] === 'function'
&& key !== 'constructor'
&& keys.add(key)
);
} while (
proto = Object.getPrototypeOf(proto)
);
keys.forEach(key => RunOutsideAngular(constructor.prototype, key));
}
class SomeClass {
@RunOutsideAngular
myFunc() {
mycode.....
}
}
// или
@RunOutsideAngularAll
class SomeClass {
myFunc() {
mycode.....
}
}RunOutsideAngular - по-хорошему надо типизировать дженериком под ангуляр.RunOutsideAngularAll - обрабатывает все методы и функции, в т.ч. унаследованные, можно упростить чтоб работал только с методами текущего класса.