@resolid/utils
Version:
Common utils
517 lines (516 loc) • 18.5 kB
text/typescript
import { DateInput } from "@formkit/tempo";
//#region src/array/index.d.ts
/**
* 将任意值转换为数组形式
*
* - 如果传入的值本身就是数组,则原样返回。
* - 如果传入的是单个值,则包装成单元素数组返回。
*
* @param input - 单个值或数组
* @returns 始终返回一个数组
*/
declare function asArray<T>(input: T | T[]): T[];
/**
* 将数组按指定大小分块
*
* @template T 数组元素类型
* @param arr 要分块的数组
* @param size 每块的最大长度
* @returns 分块后的二维数组
*/
declare function chunk<T>(arr: readonly T[], size: number): T[][];
/**
* 在指定位置插入一个元素,返回一个新的数组(不会修改原数组)
*
* @param input - 原始数组
* @param index - 要插入的位置索引(从 0 开始)
* @param item - 要插入的元素
* @returns 一个包含新元素的新数组
*
*/
declare function insert<T>(input: T[], index: number, item: T): T[];
/**
* 从数组中移除指定的元素
*
* @template T - 数组元素的类型
* @param {T[]} input - 要操作的数组
* @param {T} item - 需要移除的元素
* @returns {boolean} - 如果数组中存在该元素并成功移除返回 true,否则返回 false
*/
declare function remove<T>(input: T[], item: T): boolean;
/**
* 将一个数组按条件函数(predicate)分成两组
*
* @param input - 要处理的数组(只读,不会被修改)
* @param predicate - 判断函数,返回 true 的元素会放入第一组,否则放入第二组
* @returns [符合条件的数组, 不符合条件的数组]
*/
declare function partition<T>(input: T[], predicate: (element: T) => boolean): [Array<T>, Array<T>];
//#endregion
//#region src/date/index.d.ts
/**
* 将一个日期限制在指定范围内。
*
* @param date 要限制的日期
* @param min 最小值(可选)
* @param max 最大值(可选)
* @returns 被 clamp 后的日期(新对象)
*/
declare function clampDate(date: DateInput, min?: DateInput | null, max?: DateInput | null): DateInput;
type DateRange = {
start?: DateInput | null;
end?: DateInput | null;
};
/**
* 判断指定日期是否在日期区间
*
* @param date 指定日期
* @param range 日期区间
* @param range.start 开始
* @param range.end 结束
* @returns 是否在区间
*/
declare function isDateInRange(date: DateInput, range: DateRange): boolean;
/**
* 日期列表排序
*
* @param dates 日期列表
* @param order 排序方向,'asc' 升序(默认),'desc' 降序
* @returns 排序后的日期
*/
declare function sortDates(dates: (DateInput | null | undefined)[], order?: "asc" | "desc"): DateInput[];
/**
* 调整日期区间的开始和结束日期
* 若 start 晚于 end,则自动交换,确保 start <= end
*
* @param range 日期区间
* @param range.start 开始
* @param range.end 结束
* @returns 调整后的日期区间
*/
declare function adjustDateRange(range: DateRange): DateRange;
type GetDatesInRangeOptions = {
/**
* 时间单位
* @default "day"
*/
unit?: "day" | "month" | "year";
/**
* 偏移步长
* @default 1
*/
step?: number;
};
/**
* 枚举两个日期之间的所有日期
*
* @param start 起始日期
* @param end 结束日期
* @param options 选项
* @param options.unit - 单位: `"day"` | `"month"` | `"year"`. 默认 `"day"`
* @param options.step - 步长: 必须大于 0. 默认 `1`
*
* @returns 介于 start 和 end 之间的日期数组
*/
declare function getDatesInRange(start: DateInput, end: DateInput, options?: GetDatesInRangeOptions): DateInput[];
//#endregion
//#region src/file/index.d.ts
declare const UNITS: readonly ["Bytes", "KB", "MB", "GB", "TB"];
type Unit = (typeof UNITS)[number];
/**
* 将字节数格式化为带单位的可读字符串
*
* @param bytes - 字节数
* @param precision - 小数点后的精度位数,默认值为 2
* @param unit - 可选的强制单位, 默认进行自动单位计算
*
* @returns 格式化后的字符串
*/
declare function formatBytes(bytes: number, precision?: number, unit?: Unit | null): string;
/**
* 检查文件是否匹配 accept 规则
*
* @param fileName - 文件名
* @param mimeType - 文件的 MIME 类型
* @param accept - 接受的文件类型规则
*
* @returns 如果文件匹配任一规则则返回 true,否则返回 false
*/
declare function matchesAccept(fileName: string, mimeType: string, accept: string): boolean;
//#endregion
//#region src/types/index.d.ts
type Booleanish = boolean | "true" | "false";
type Simplify<T> = { [K in keyof T]: T[K] } & {};
type ValueOrFunction<T, A extends unknown[] = []> = T | ((...args: A) => T);
//#endregion
//#region src/function/index.d.ts
/**
* 空函数(no operation)。
*
* 什么也不做,通常用于占位、默认回调或避免 undefined 调用。
*/
declare function noop(): void;
/**
* 异步等待指定毫秒数。
*
* @param ms - 要等待的毫秒数
* @returns 一个在指定时间后 resolve 的 Promise
*/
declare function sleep(ms: number): Promise<void>;
/**
* 创建一个始终返回固定值的函数。
*
* @param value - 要固定返回的值
* @returns 一个无参数函数,每次调用都会返回该值
*/
declare function always<T>(value: T): () => T;
/**
* 将一个 Promise 转换为 [error, data] 的形式,便于 async/await 异常处理。
*
* 作用类似 try/catch,但可以用解构直接获取结果和错误:
*
* @param promise - 要处理的 Promise 对象
* @returns 一个 Promise,resolve 为一个长度为 2 的元组:
* - 成功时:[null, data]
* - 失败时:[error, undefined]
*/
declare function to<T, E = Error>(promise: Promise<T>): Promise<[E, undefined] | [null, T]>;
/**
* 如果传入的是函数,则执行它并返回结果;否则直接返回该值。
*
* 常用于允许参数既可以是静态值,也可以是动态函数的场景。
*
* @template T - 返回值类型
* @template A - 函数参数类型
* @param value - 值或函数
* @param args - 如果 value 是函数,传递给它的参数
* @returns 如果 value 是函数,则返回函数执行结果,否则直接返回 value
*/
declare function runIf<T, A extends unknown[]>(value: ValueOrFunction<T, A>, ...args: A): T;
/**
* 将多个函数组合成一个函数,同时调用所有非空函数。
*
* 常用于事件处理器、回调组合,避免手动逐个调用。
*
* @template T - 函数类型
* @param fns - 要组合的函数数组,允许 null 或 undefined
* @returns 一个新函数,调用时会依次调用 fns 中所有非空函数
*/
declare function callAll<T extends (...args: any[]) => void>(...fns: (T | null | undefined)[]): (...args: Parameters<T>) => void;
//#endregion
//#region src/is/index.d.ts
declare const __DEV__: boolean;
declare const isBrowser: boolean;
type Truthy<T> = T extends false | "" | 0 | null | undefined ? never : T;
/**
* 判断一个值是否为“真值”(truthy)。
*
* 在 JavaScript 中,以下值会被认为是“假值”(falsy):
* - false
* - 0
* - -0
* - 0n
* - ""
* - null
* - undefined
* - NaN
*
* 除此之外的值都被认为是“真值”(truthy)。
*
* @param value - 要判断的值
* @returns 如果值为真值则返回 true,否则返回 false
*/
declare function isTruthy<T>(value: T): value is Truthy<T>;
/**
* 判断一个值是否为 `undefined`。
*
* @param value - 要判断的值
* @returns 如果值为 `undefined`,返回 true,否则返回 false
*/
declare function isUndefined(value: unknown): value is undefined;
/**
* 判断一个值是否已定义(即不为 `undefined` 或 `null`)。
*
* @param value - 要判断的值
* @returns 如果值既不是 `undefined` 也不是 `null`,则返回 true
*/
declare function isDefined<T>(value: T): value is NonNullable<T>;
/**
* 判断一个值是否为布尔类型(boolean)。
*
* @param value - 要判断的值
* @returns 如果值是布尔类型,返回 true,否则返回 false
*/
declare function isBoolean(value: unknown): value is boolean;
/**
* 判断一个值是否为数字类型(number)。
*
* @param value - 要判断的值
* @returns 如果值是数字则返回 true,否则返回 false
*/
declare function isNumber(value: unknown): value is number;
/**
* 判断一个值是否为字符串类型。
*
* @param value - 要判断的值
* @returns 如果值是字符串则返回 true,否则返回 false
*/
declare function isString(value: unknown): value is string;
/**
* 判断一个值是否为对象类型(排除 null)。
*
* @param value - 要判断的值
* @returns 如果值是对象(且不为 null)则返回 true,否则返回 false
*/
declare function isObject(value: unknown): value is Record<string, unknown>;
/**
* 判断一个值是否为 `undefined` 或 `null`(即“nullish”)。
*
* @param value - 要判断的值
* @returns 如果值是 `undefined` 或 `null`,则返回 true,否则返回 false
*/
declare function isNullish(value: unknown): value is null | undefined;
/**
* 判断一个值是否为函数类型。
*
* @param value - 要判断的值
* @returns 如果值是函数则返回 true,否则返回 false
*/
declare function isFunction(value: unknown): value is Function;
/**
* 判断一个值是否为 Date 对象。
*
* @param value - 要判断的值
* @returns 如果值是 Date 对象则返回 true,否则返回 false
*/
declare function isDate(value: unknown): value is Date;
/**
* 判断一个值是否为 BigInt 对象。
*
* @param value - 要判断的值
* @returns 如果值是 BigInt 对象则返回 true,否则返回 false
*/
declare function isBigInt(value: unknown): value is bigint;
/**
* 判断一个值是否“为空”。
*
* 规则:
* - null 或 undefined → 为空
* - 数字 0 → 为空
* - 字符串只包含空白字符 → 为空
* - 空数组 → 为空
* - 空对象 → 为空
* - 其他类型 → 不为空
*
* @param value - 要判断的值
* @returns 如果值为空则返回 true,否则返回 false
*/
declare function isEmpty(value: unknown): boolean;
/**
* 判断一个值是否为 Promise 对象。
*
* @param value - 要判断的值
* @returns 如果值是 Promise 对象则返回 true,否则返回 false
*/
declare function isPromise(value: unknown): value is Promise<unknown>;
//#endregion
//#region src/number/index.d.ts
/**
* 将一个数值限制在指定范围内(支持 number 与 bigint)。
*
* @param value 要限制的数值
* @param min 最小值(可选)
* @param max 最大值(可选)
* @returns 如果 value 小于 min,则返回 min;如果大于 max,则返回 max;否则返回 value 本身
*/
declare function clamp<T extends number | bigint>(value: T, min?: T | null, max?: T | null): T;
/**
* 生成一个从 start 到 end(包含 end)的整数数组。
*
* @param start - 起始值(包含)
* @param end - 结束值(包含)
* @returns 包含从 start 到 end 的整数数组,如果 start > end,则返回空数组
*/
declare function range(start: number, end: number): number[];
//#endregion
//#region src/object/index.d.ts
/**
* 创建一个新对象,排除指定的键。
*
* @template T - 原始对象类型
* @template K - 要排除的键的联合类型
* @param object - 原始对象
* @param keys - 要排除的键数组
* @returns 一个新对象,包含原对象的所有属性,除了 keys 中指定的属性
*/
declare function omit<T extends object, K extends keyof T>(object: T, keys: readonly K[]): Omit<T, K>;
/**
* 根据回调函数过滤对象属性,返回一个新对象,只保留回调返回 false 的属性。
*
* @template T - 原始对象类型
* @param object - 要处理的对象
* @param should - 回调函数,接收 value 和 key:
* - 返回 true → 忽略该属性
* - 返回 false → 保留该属性
* @returns 一个新对象,包含原对象中未被 omit 的属性
*/
declare function omitBy<T extends object>(object: T, should: (value: T[keyof T], key: keyof T) => boolean): Partial<T>;
/**
* 从对象中挑选指定的键,返回一个新对象。
*
* @template T - 原始对象类型
* @template K - 要挑选的键的联合类型
* @param object - 原始对象
* @param keys - 要挑选的键数组
* @returns 一个新对象,只包含 keys 中指定的属性
*/
declare function pick<T extends object, K extends keyof T>(object: T, keys: readonly K[]): Pick<T, K>;
/**
* 根据回调函数过滤对象属性,返回一个新对象,只保留回调返回 true 的属性。
*
* @template T - 原始对象类型
* @param object - 要处理的对象
* @param should - 回调函数,接收 value 和 key:
* - 返回 true → 保留该属性
* - 返回 false → 忽略该属性
* @returns 一个新对象,包含原对象中被 pick 的属性
*/
declare function pickBy<T extends object>(object: T, should: (value: T[keyof T], key: keyof T) => boolean): Partial<T>;
/**
* 根据给定的路径字符串,安全地获取对象中的深层属性值。
*
* @template T 默认值类型
* @param value 要读取的目标对象
* @param path 属性访问路径
* @param defaultValue 当路径不存在或解析失败时返回的默认值
* @returns 解析得到的属性值或默认值
*/
declare function get<T = unknown>(value: any, path: string, defaultValue?: T): T;
//#endregion
//#region src/string/index.d.ts
/**
* 将字符串的首字母转换为大写,其余保持不变。
*
* @param str - 要处理的字符串
* @returns 首字母大写后的字符串,如果传入空字符串或 falsy 值,返回空字符串
*/
declare function capitalize(str: string): string;
/**
* 将字符串转换为驼峰命名(camelCase)格式
*
* @param str - 需要转换的字符串
* @returns 驼峰命名格式的字符串
*/
declare function camelCase(str: string): string;
/**
* 将字符串转换为帕斯卡命名(PascalCase)格式
*
* @param str - 需要转换的字符串
* @returns 帕斯卡命名格式的字符串
*/
declare function pascalCase(str: string): string;
/**
* 将字符串转换为短横线(kebab-case)格式
*
* @param str - 需要转换的字符串
* @returns 短横线格式的字符串
*/
declare function kebabCase(str: string): string;
/**
* 将字符串转换为蛇形命名(snake_case)格式
*
* @param str - 需要转换的字符串
* @returns 蛇形命名格式的字符串
*/
declare function snakeCase(str: string): string;
/**
* 判断字符串是否以指定前缀开头,可选择忽略大小写。
*
* @param text - 要检查的字符串
* @param prefix - 前缀字符串
* @param ignoreCase - 是否忽略大小写,默认 true
* @returns 如果 text 以 prefix 开头,则返回 true,否则返回 false
*/
declare function startsWith(text: string, prefix: string, ignoreCase?: boolean): boolean;
/**
* 判断字符串是否以指定后缀结尾,可选择忽略大小写。
*
* @param text - 要检查的字符串
* @param suffix - 后缀字符串
* @param ignoreCase - 是否忽略大小写,默认 true
* @returns 如果 text 以 suffix 结尾,则返回 true,否则返回 false
*/
declare function endsWith(text: string, suffix: string, ignoreCase?: boolean): boolean;
/**
* 如果字符串以指定前缀开头,则去掉该前缀。
*
* @param text - 要处理的字符串
* @param prefix - 要移除的前缀
* @param ignoreCase - 是否忽略大小写,默认 true
* @returns 去掉前缀后的字符串,如果 text 不以 prefix 开头,则返回原字符串
*/
declare function trimStart(text: string, prefix: string, ignoreCase?: boolean): string;
/**
* 如果字符串以指定后缀结尾,则去掉该后缀。
*
* @param text - 要处理的字符串
* @param suffix - 要移除的后缀
* @param ignoreCase - 是否忽略大小写,默认 true
* @returns 去掉后缀后的字符串,如果 text 不以 suffix 结尾,则返回原字符串
*/
declare function trimEnd(text: string, suffix: string, ignoreCase?: boolean): string;
/**
* 生成指定长度的随机字符串
* 使用数字、大小写字母作为字符集
*
* @param size - 生成字符串的长度,默认为 16
* @returns 随机生成的字符串
*/
declare function random(size?: number): string;
//#endregion
//#region src/throttle/index.d.ts
type ThrottleOptions = {
start?: boolean;
middle?: boolean;
once?: boolean;
};
type Throttler<T extends unknown[]> = {
(...args: T): void;
cancel: () => void;
};
/**
* 创建一个节流函数,限制回调在指定时间间隔内执行次数。
*
* @template T - 回调函数参数类型
* @param callback - 要节流执行的函数
* @param wait - 节流时间间隔(毫秒),默认 0
* @param options - 配置选项
* - start: 是否立即执行第一次,默认 true
* - middle: 是否在间隔时间内允许再次执行,默认 true
* - once: 是否执行一次后自动取消,默认 false
* @returns 一个节流后的函数,并附带 cancel 方法可取消
*/
declare function throttle<T extends unknown[]>(callback: (...args: T) => unknown, wait?: number, {
start,
middle,
once
}?: ThrottleOptions): Throttler<T>;
/**
* 创建一个防抖函数,在连续调用时只在停止调用后执行回调。
*
* @template T - 回调函数参数类型
* @param callback - 要防抖执行的函数
* @param wait - 防抖时间间隔(毫秒),默认 0
* @param options - 配置选项(同 throttle)
* - start: 是否立即执行第一次,默认 false
* - middle: 是否允许间隔内触发,默认 false
* - once: 是否执行一次后自动取消,默认 false
* @returns 一个防抖后的函数,并附带 cancel 方法可取消
*/
declare function debounce<T extends unknown[]>(callback: (...args: T) => unknown, wait?: number, {
start,
middle,
once
}?: ThrottleOptions): Throttler<T>;
//#endregion
export { Booleanish, DateRange, Simplify, ThrottleOptions, Throttler, ValueOrFunction, __DEV__, adjustDateRange, always, asArray, callAll, camelCase, capitalize, chunk, clamp, clampDate, debounce, endsWith, formatBytes, get, getDatesInRange, insert, isBigInt, isBoolean, isBrowser, isDate, isDateInRange, isDefined, isEmpty, isFunction, isNullish, isNumber, isObject, isPromise, isString, isTruthy, isUndefined, kebabCase, matchesAccept, noop, omit, omitBy, partition, pascalCase, pick, pickBy, random, range, remove, runIf, sleep, snakeCase, sortDates, startsWith, throttle, to, trimEnd, trimStart };