@ arkv/ 共享
零依赖性共享公用事业和类型 @arkv 软件包.
安装
bun add @arkv/shared
# or
npm install @arkv/shared
公用事业
阵列
import { groupBy, unique, chunk } from '@arkv/shared';
groupBy(
[{ type: 'fruit', name: 'apple' }, { type: 'veg', name: 'carrot' }],
i => i.type,
);
// { fruit: [{ type: 'fruit', name: 'apple' }], veg: [{ type: 'veg', name: 'carrot' }] }
unique([1, 2, 2, 3]); // [1, 2, 3]
unique(items, i => i.id); // deduplicate by key
chunk([1, 2, 3, 4, 5], 2); // [[1, 2], [3, 4], [5]]
对象
import { pick, omit, deepClone, isPlainObject, safeEntries } from '@arkv/shared';
pick({ a: 1, b: 2, c: 3 }, ['a', 'c']); // { a: 1, c: 3 }
omit({ a: 1, b: 2, c: 3 }, ['b']); // { a: 1, c: 3 }
const cloned = deepClone({ nested: { value: 1 } });
// Prototype-based: only object literals, `JSON.parse` output and
// `Object.create(null)` qualify.
isPlainObject({}); // true
isPlainObject(Object.create(null)); // true
isPlainObject([]); // false
isPlainObject(new Error()); // false
isPlainObject(new Map()); // false
isPlainObject(new Date()); // false
isPlainObject(new MyClass()); // false
// `Object.entries` that cannot be taken down by a throwing getter.
safeEntries({ ok: 1, get boom() { throw new Error('x'); } });
// [['ok', 1], ['boom', '[Getter: threw]']]
数目
import { clamp, randomInt } from '@arkv/shared';
clamp(15, 0, 10); // 10
clamp(-5, 0, 10); // 0
randomInt(1, 100); // random integer between 1 and 100 (inclusive)
自动同步
import { retry, debounce, sleep } from '@arkv/shared';
// Retry up to 3 times with 100ms delay between attempts
const data = await retry(() => fetchData(), 3, 100);
// Debounce a function by 300ms
const debouncedSave = debounce(save, 300);
await sleep(1000); // wait 1 second
字符串
import { safeStringify } from '@arkv/shared';
// Handles circular references without throwing
const obj: any = { a: 1 };
obj.self = obj;
safeStringify(obj); // '{"a":1,"self":"[Circular]"}'
網址
import { UrlHelper } from '@arkv/shared';
const url = new UrlHelper();
url.buildUrl({
base: 'https://api.example.com/{version}',
path: '/users/{id}',
pathParams: { version: 'v1', id: 123 },
queryParams: { fields: 'name', active: true },
});
// https://api.example.com/v1/users/123?fields=name&active=true
url.interpolate('/api/{version}/users/{id}', { version: 'v1', id: 42 });
// '/api/v1/users/42'
类型
import type {
AsyncFn,
Prettify,
StringTransformFn,
ParamsType,
} from '@arkv/shared';
| 类型 | 说明 |
AsyncFn<T> | 一般自动同步函数类型 |
Prettify<T> | 扩展对象类型以进行更好的 IDE 悬空预览 |
StringTransformFn | 转换字符串的函数( 例如, 应用颜色/ 样式) |
ParamsType | Record<string, string | number | boolean | undefined> |
API 参考
阵列公用事业
| 函数 | 签署 | 说明 |
groupBy | (items: T[], keyFn: (item: T) => string) => Record<string, T[]> | 按键分组数组项目 |
unique | (items: T[], keyFn?: (item: T) => unknown) => T[] | 删除重复, 有可选密钥函数 |
chunk | (items: T[], size: number) => T[][] | 将数组分割成指定大小的块 |
实物公用事业
| 函数 | 签署 | 说明 |
pick | (obj: T, keys: K[]) => Pick<T, K> | 从对象中选择指定的密钥 |
omit | (obj: T, keys: K[]) => Omit<T, K> | 来自对象的指定密钥 |
deepClone | (value: T) => T | 深克隆通过 structuredClone |
isPlainObject | (obj: unknown) => obj is Record<string, unknown> | 只对原型是 Object.prototype 或者说 null |
safeEntries | (obj: Record<string, unknown>) => [string, unknown][] | Object.entries 其中投球者得分 '[Getter: threw]' |
公用事业数目
| 函数 | 签署 | 说明 |
clamp | (value: number, min: number, max: number) => number | 分数和最大数之间的剪接 |
randomInt | (min: number, max: number) => number | 分数和最大数之间的随机整数(包括) |
Async公用事业
| 函数 | 签署 | 说明 |
retry | (fn: () => Promise<T>, retries?: number, delayMs?: number) => Promise<T> | 延迟重试同步函数 |
debounce | (fn: T, delayMs: number) => (...args) => void | 创建已取消的函数 |
sleep | (ms: number) => Promise<void> | 基于承诺的延迟 |
串接公用事业
| 函数 | 签署 | 说明 |
safeStringify | (obj: unknown) => string | JSON. 使用循环参考处理 |
URL 公用事业
| 类 | 方法 | 说明 |
UrlHelper | buildUrl(config) | 以路径/ query/ 路径参数构建 URL |
UrlHelper | interpolate(template, params?) | 替换 {key} 字符串中的占位符 |
许可证
麻省理工学院