type SumOrConcat = {
(a: number, b: number): number
(a: string, b: number): string
}
const result: SumOrConcat = (a: number | string, b: number): any => {
if (typeof a === 'number') {
return a + b
}
return `${a} ${b}`
}
Но надежнее все же так:type SumOrConcat = {
(a: number, b: number): number
(a: string, b: number): string
}
const result = ((a: number | string, b: number): number | string => {
if (typeof a === 'number') {
return a + b
}
return `${a} ${b}`
}) as SumOrConcat;
Ну и надо отметить, что синтаксис самих перегрузок таких проблем не имеет, хотя стрелочную функцию с ним не опишешьfunction sumOrConcat(a: number, b: number): number;
function sumOrConcat(a: string, b: number): string;
function sumOrConcat(a: number | string, b: number): number | string {
if (typeof a === 'number') {
return a + b
}
return `${a} ${b}`
}
const result = sumOrConcat;
runtimeChunk: 'single'
, который выносит весь runtime код webpack в отдельный чанк и позволяет переиспользовать его для всех бандлов. Увлекаюсь программированиемесли действительно увлекаетесь, то есть Вам по кайфу сам процесс разработки, то можете не переживать, навыки они приобретаются и развиваются, а когда работа приносит удовольствие, то необходимые для нее навыки развивать в разы проще.
Здесь Вы выделяете гораздо больше байт, чем Вам нужно,ss = (char*)calloc(n, sizeof(char*)); // выделяем память под строку
sizeof(char*)
будет равен 8 на 64 битных архитектурах, когда sizeof(char)
- 1. Но при этом стоит не забывать про место под '\0'
в конце строки.Почитайте, что делает функцияgets(ss); printf("Введите свое слово (не забываем про длину строки): "); scanf("%s", ss);
ss = (char*)realloc(i, sizeof(char*)); gets(ss);
gets
. Опять же проблема с размерами символа. Ну и у realloc
несколько другая сигнатура. И вообще realloc
достаточно недешевая операция, не за чем ее делать в цикле много раз над одним указателем, достаточно 1 раз в конце.Проверку на NULL нужно делать сразу после аллокации памяти. А вот в цикле ее делать незачем.if (ss[i] != NULL) // проверка на нулевой указатель
Операцияss[j] = ss[j++];// здесь я заменял тот символ на следующий, тем самым перекидывая его в конец
j++
меняет j
.Операцияfor (int i = 0; i < sizeof(ss); i++)// ну а тут пытался поменять размер
sizeof(ss)
даст размер char*
, то есть размер указателя, что соответствует 8 на 64 битных архитектурах. Для вычисления длины строки (терминированной символом '\0'
) есть функция strlen
. А в данном случае вообще можно посчитать количество удаленных символов и из него вычислить длину результирующей строки, что будет дешевле.constructor
любого типа T
, который является подтипом типа { new (...args: any[]): {} }
{ new (...args: any[]): {} }
- это абсолютно тоже самое, что и new (...args: any[]) => {}
. Это сигнатура конструктора, с любым количеством любых элементов и инстанциирующий значение с типом {}
.{}
- это множество всех не нулевых значений (не только объектов), то есть по сути это как тип any, но без null | undefined
и с не сломанной вариантностью. Здесь его безболезненно можно заменить на тип unknown
, в отличии от тех же аргументов, где из-за контрвариантности аргументов функций (и конструкторов) предикаты на типах ломаются и без any нормально не сделать.произведение элементов массива
let p = 1;
// в цикле:
p *= arr[i];
кратных 3
n % 3 === 0
оканчивающихся на 5
n % 10 === 5
если таких элементов нетв общем случае делается введением флага:
let hasElements = false;
if (/* ... */) {
hasElements = true;
}
Но конкретно в этом случае, так как 1 гарантированно не попадает под условия, а все остальные числа изменят произведение, можно проще p !== 1
styled.li<{ menu?: any }>`
``
) можно применить функцию-тэг, она будет вызвана с массивом фиксированных строк и интерполируемыми значениями (`${/* вот этими */ value}`
).{ menu?: any }
) или не передавать (тогда дженерик выведется автоматически из аргументов)А тут в качестве интерполируемого значения передается стрелочная функция, в которой деструктурирован первый аргумент. В данном случае это нормально, так как функция-тег получит данную функцию "как есть", без приведения к строке.${({ menu }) => menu && css
Цель инкапсуляции это объединение объектовкто Вам такое сказал?