function series(tasks) {
return tasks.reduce((p, task) =>
p.then(() =>
task()), Promise.resolve());
}
series([
async () => { /* ... */ },
async () => { /* ... */ },
async () => { /* ... */ },
async () => { /* ... */ },
]);
async function series(tasks) {
for (const task of tasks) {
await task();
}
}
series([
async () => { /* ... */ },
async () => { /* ... */ },
async () => { /* ... */ },
async () => { /* ... */ },
]);
:warning: Since webpack v4 the extract-text-webpack-plugin should not be used for css. Use mini-css-extract-plugin instead.https://v4.webpack.js.org/plugins/extract-text-web...
Как вы считаете, всегда ли необходим label в связке с input? Даже если нет текста, по которому можно кликнуть и перескочить в поле ввода. Или допустим, тег label, не используется в качестве контейнера.Пустой label крайне вреден, особенно если его можно кликнуть и клик приводит к непредсказуемому поведению - взаимодействию с input, взаимодействию, которого не ожидает пользователь. Все не ожиданное ведет к плохому UX.
Встречал примеры, где тег label, связывают через идентификатор с input и при этом, прячут его, с помощью visually-hidden. Зачем? Причём так делают, некоторые школы и опытные разработчики.Так делают для скринридеров, когда придурок дизайнер не предусмотрел label в дизайне, а без него никак. Делаем нормальный UX, не ломая визуал заложенный тем ущербом, который "я дисигнер я так вижу".
function f() {
// это мертвый код, после оптимизации f строка вообще не будет память использовать
let a = 'some text';
// это 2 молодых объекта, на них уже ссылается контекст вызова f, а на него ссылается стэк
var obj1 = {};
var obj2 = {};
obj1.p = obj2; // obj1 references obj2
obj2.p = obj1; // obj2 references obj1. This creates a cycle.
// при завершении функции стэк перестает ссылаться на контекст вызова
// контекст вызова умрет при ближайшей GC,
// а вместе с ним и obj1 и obj2, так как их никто не отметит "живыми"
}
f();
async function test() {
let savedResolve, sevedReject;
const promiseForReturn = new Promise((resolve, reject) => {
// этот колбэк отрабатывает синхронно
sevedResolve = resolve;
savedReject = reject;
});
// поэтому savedResolve и sevedReject уже доступны здесь
sevedReject(1);
return promiseForReturn; // промис возвращаемый test() будет связан с этим и ждать его
}
async function test() {
let savedResolve, sevedReject;
const promiseForReturn = new Promise((resolve, reject) => {
sevedResolve = resolve;
savedReject = reject;
});
// это deadlock
await promiseForReturn;
sevedResolve(1);
}
type ChooseKeys<O, T> = {
[K in keyof O]: O[K] extends T ? K : never;
}[keyof O];
// 'number' | 'alsoNumber'
type Test1 = ChooseKeys<{
number: number;
alsoNumber: number;
string: string;
anotherString: string;
bool: boolean;
}, number>;
// 'number' | 'alsoNumber' | 'bool'
type Test2 = ChooseKeys<{
number: number;
alsoNumber: number;
string: string;
anotherString: string;
bool: boolean;
}, number | boolean>;
type AsCamelCase<S extends string> = S extends `${infer A}_${infer B}` ? `${A}${Capitalize<AsCamelCase<B>>}` : S;
type CamelCaseKeysRecord<T> = T extends Record<PropertyKey, unknown> ? {
[K in string & keyof T as AsCamelCase<K>]: CamelCaseKeysRecord<T[K]>;
} & {
[K in Exclude<keyof T, string>]: CamelCaseKeysRecord<T[K]>;
} : T;
function toCamelCaseKeys<T>(val: T): CamelCaseKeysRecord<T> {
if (Array.isArray(val)) {
return val.map(toCamelCaseKeys) as unknown as CamelCaseKeysRecord<T>;
}
if (typeof val === 'object') {
return Object.fromEntries(Object
.entries(val)
.map(([k, v]) => [
k.replace(/_+(.)/g, (_, g) => g.toUpperCase()),
toCamelCaseKeys(v as Record<string, unknown>),
])) as CamelCaseKeysRecord<T>;
}
return val as unknown as CamelCaseKeysRecord<T>;
}
много где начинает ругаться например что у ControlsProps нет метода foreachвсе правильно ругается, по Вашим типам ControlsProps - это plain object, где ключом может быть любая строка, а все значения - ControlProps или массив ControlProps. У произвольного объекта нет метода forEach.
Не подскажете как вообще правильные ситуации обрабатывать, может подход с ControlsProps | ControlsProps[] в корне неправильныйhttps://www.typescriptlang.org/docs/handbook/2/nar...
import 'vue'; // нужно чтоб слинковаться с базовыми модулем и интерфейсом
declare module 'vue' { // расширяем модуль
import vClickOutside from 'v-click-outside'; // подключаем типы плагина
interface Vue { // расширяем интерфейс
// прописываем нужные расширения
vClickOutside(): typeof vClickOutside;
}
}
const {Shop} = require('Shop');
const shop = new Shop();
product["id"], product["name"]
можно писать product.id, product.name
, поля же известны заранее, незачем усложнять{}
, а не массивом []
, так как ключи - произвольные id, поле #products тоже у Вас не особо на массив похоже