type AlbumType = {
id: number;
title: string;
};
enum ActionPoints {
SET_ALBUMS = "SET_ALBUMS",
ADD_ALBUM = "ADD_ALBUM",
REMOVE_ALBUM = "REMOVE_ALBUM"
}
type ActionType = {
type: ActionPoints.SET_ALBUMS;
payload: AlbumType[];
} | {
type: ActionPoints.ADD_ALBUM;
payload: AlbumType;
} | {
type: ActionPoints.REMOVE_ALBUM;
payload: number;
};
const reducer = (state: AlbumType[], action: ActionType) => {
switch (action.type) {
case ActionPoints.SET_ALBUMS:
return action.payload;
case ActionPoints.ADD_ALBUM:
return [...state, action.payload];
case ActionPoints.REMOVE_ALBUM:
return state.filter((album) => album.id !== action.payload);
default:
return state;
}
}; declare const JSON: {
id: number;
}[];
export default JSON; einzigartig([1, 2, 3, 4, 5]) // [1, 2, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5]if(arr[i] !== arr1[j]) ведь и i и j пробегают все элементы массиваCOUNT() - это агрегатная функция.! - это булево отрицание. И он приводит свой аргумент к типу boolean. Автор не открыл Америку, и это используется. Но использовать нужно с умом.false - это undefined, null, '' (пустая строка), 0, 0n (bigint 0), NaN.!! - это всего лишь 2 идущих подряд оператора !, это такое популярное сокращение для быстрого каста к boolean.!!!, но это бессмысленно, так как тройное отрицание даст тоже самое что и одинарное. number | string | symboltype MyFunc = <N extends string>() => (N extends string ? Field<N> : never)[];но возвращаемый тип так же будет юнионом:({ name: "town" } | { name: "city" })[]"town" | "city" это тоже самое, что и тип "city" | "town".type MyFunc = <N extends string[]>() => {
[K in keyof N]: N[K] extends string ? Field<N[K]> : never;
};
myFunc<["town", "city"]>()as const, что так же делает его readonly массивом. Но принимать аргументы через readonly там где нам не нужно их мутирорвать - это вообще хорошая практика. Полный пример будет выглядеть так:Иначе говоря, в ООП-шном стиле и в функциональном (если я правильно понимаю).в обоих случаях процедурный стиль
Пока возникает ощущение, что всё это - сугубо вкусовщинаПо сути да, чисто вкусовщина.
const controller = { login }
export default controller на export default loginНо для ноды terser редко используют