type Char = "A" | "B" | "C" | "D";
type ConcatMap<T> = T extends unknown
? {} extends T[keyof T]
? `${string & keyof T}`
: `${string & keyof T}${ConcatMap<T[keyof T]>}`
: never;
type MapChars<C extends Char> = {
[K in C]: MapChars<Exclude<C, K>>
};
type Split<S extends string> = S extends `${infer H}${infer Tail}`
? [H, ...Split<Tail>]
: [];
type T1 = Split<T2>;
type T2 = ConcatMap<MapChars<Char>>;
type Split<S extends string, D extends string = ''> = S extends ''
? []
: S extends `${infer H0}${D}${infer H1}${D}${infer H2}${D}${infer H3}${D}${infer H4}${D}${infer H5}${D}${infer Tail}`
? [H0, H1, H2, H3, H4, H5, ...Split<Tail, D>]
: S extends `${infer H0}${D}${infer H1}${D}${infer H2}${D}${infer H3}${D}${infer Tail}`
? [H0, H1, H2, H3, ...Split<Tail, D>]
: S extends `${infer H0}${D}${infer Tail}`
? [H0, ...Split<Tail, D>]
: never;
@Controller()
@Get('/dashboard')
@Render ('dashboard')
async getDashboard () {
const sites = await this.usersSitesService.selectSitesByUserId(1);
return { sites };
}
Какой смысл в тайпскрипте, если писатьselectSitesByUserId = async (id: number): Promise<any>
any
?Репо с докой router-controller https://github-com.translate.goog/typestack/routin...Ссылка на машинный перевод? Вы это серьезно?
Либо я чего-то не понимаюНе понимаете значение слова асинхронный
console.log
отрабатывает раньше любого errorsOnLines.push
Как написать это с помощью промисов и async/await, я знаю. А как написать это без промисов, с обычным коллбэком? До изобретения промисов как-то ведь писали такое...у api тоже может быть колбэк, который можно вызвать когда будет готов результат операции
const api = (cb) => {
fs.readFile(fileName, (err, content) => {
if (err) {
cb("none")
} else {
cb(content)
}
})
// return не нужен
}
Подскажите пожалуйста, стоит ли явно определять тип переменной или нет?В большинстве случаев нет, лучше доверится выводу типов, он сделает это лучше.
есть, так как ts знает, что const нельзя переприсвоить, а числа неизменяемый тип, он выведет тут литеральный тип 10, который без проблем можно передать как в number так и в union из литеральных типов содержащий в себе 10const a: number = 10;
Есть ли вообще какие то отличия?
// где-то есть
type SomeObject = { /* ... */ };
function getSomeObject(): SomeObject { /* ... */ }
// без явной декларации будет выведен тип null
let v: SomeObject | null = null;
setTimeout(() => {
// без явной декларации типа для v здесь будет ошибка
v = getSomeObject();
});
n % 10
const lastDigit = n => {
// в n совсем не то
if (isNaN(n) || !isFinite(n)) return NaN;
// в n целое
if (n % 1 === 0) return n % 10;
// для дробных проще со строкой работать
const s = String(Math.abs(n));
// неточные значения
if (s.length > 16 || s.includes('e')) return NaN;
return +s.slice(-1);
}
type EventData = {
event: Parameters<typeof thumbHandler>[0];
};
const handleThumbEnd = (eventData: EventData) => thumbHandler(eventData.event, true);
const handleThumbMove = useThrottledFn(
(eventData: EventData) => thumbHandler(eventData.event),
250,
);
const handlers = useSwipeable({
onSwiping: handleThumbMove,
onSwiped: handleThumbEnd,
preventDefaultTouchmoveEvent: true,
trackMouse: true,
trackTouch: true,
});
или так:type HandlerMove = Parameters<typeof useSwipeable>[0]['onSwiping'];
type HandlerEnd = Parameters<typeof useSwipeable>[0]['onSwiped'];
const handleThumbEnd: HandlerMove = (eventData) => thumbHandler(eventData.event, true);
const handleThumbMove: HandlerEnd = useThrottledFn(
(eventData) => thumbHandler(eventData.event),
250,
);
const handlers = useSwipeable({
onSwiping: handleThumbMove,
onSwiped: handleThumbEnd,
preventDefaultTouchmoveEvent: true,
trackMouse: true,
trackTouch: true,
});
или так const f = i => {
console.log(i);
};
for (let i = 0; i < 5; i++) {
setTimeout(f, 1000, i);
}