@dpaskhin/unique

中文文档
1.1.0发布于 2026/07/10MITTypeScriptESM + CJS零依赖近 30 天下载 5643

通过拒绝重复来保证独特的值.

中文使用文档
文档目录14 节
  1. 目录
  2. 安装
  3. 特征
  4. 使用量
  5. API 参考
  6. 唯一事实( fn, 选项)
  7. 独有( fn, 参数, 选项)
  8. 独有( 值, 选项)
  9. 唯一错误
  10. 全球
  11. 处理错误
  12. 最佳做法
  13. 许可证
  14. 捐款

@dpaskhin/ 独一无二

npm version bundle size license

@dpaskhin/ 独一无二 是用于生成独特值的 TypeScript 库。 它通过拒绝重复来保证不重复 并重试直到找到新结果。 确保非重复随机值的理想值 .

目录

安装

要安装 @dpaskhin/ 独一无二,运行 :

npm install --save-dev @dpaskhin/unique

或者,如果你使用pnpm:

pnpm add --save-dev @dpaskhin/unique

特征

  • 根据任何函数或平方值的输出生成独特的值.
  • 支助 custom 存储或 global 存储用于独有性跟踪.
  • 可配置 retry 财务报告和审定财务报表 timeout 选项.
  • stringifier 支持在特性检查时自定义处理复杂对象.

使用量

基本示例

这里有一个使用 @dpaskhin/ 独一无二数字 :

import { unique } from '@dpaskhin/unique';

// Outputs a unique random number each time
console.log(unique(Math.random));
console.log(unique(Math.random));
console.log(unique(Math.random));

Faker.js 示例

@dpaskhin/ 独一无二 和图书馆合作得很好 Faker.js (英语) 用于生成唯一 随机数据.

import { unique, uniqueFactory } from '@dpaskhin/unique';
import { faker } from '@faker-js/faker';

// Outputs a unique first name each time
console.log(unique(faker.person.firstName));
console.log(unique(faker.person.firstName));
console.log(unique(faker.person.firstName));

// ----------------------------------------

const createUniqueUser = uniqueFactory(() => ({
  firstName: faker.person.firstName(),
  lastName: faker.person.lastName(),
  age: faker.number.int({ min: 18, max: 100 }),
}));

// Each output user is structurally unique
console.log(createUniqueUser());
console.log(createUniqueUser());
console.log(createUniqueUser());

自定义存储

你可以提供自己的商店 来隔离独特的检查。 这确保了在以下范围内跟踪独特性: 你的申请.

import { unique } from '@dpaskhin/unique';

const scopedStore = new Set();

// Outputs a unique random number
console.log(unique(Math.random, [], { store: scopedStore }));

全球存储

如果您不提供自定义商店, 图书馆会使用 全球 默认。 这可以有用,如果你 想要跟踪您应用程序不同部分的独特值.

import { unique, GLOBAL_STORE } from '@dpaskhin/unique';

// Use the global store for uniqueness checks
const uniqueRandomValue1 = unique(Math.random);
const uniqueRandomValue2 = unique(Math.random);

// Outputs two unique random values
console.log(uniqueRandomValue1, uniqueRandomValue2);

// Clear the global store when needed
GLOBAL_STORE.clear();

不包括具体价值

您也可以提供排除列表,以防止特定值在独特性检查时被考虑.

import { uniqueFactory } from '@dpaskhin/unique';

const createUniqueRandom = uniqueFactory(Math.random, {
  // Prevents these values from being returned
  exclude: [0.5, 0.6],
});

// Outputs a unique random number, excluding 0.5 and 0.6
console.log(createUniqueRandom());

复杂对象或其他非原始类型的字符串

这个 字符串 选项允许您处理复杂的对象,将它们转换成字符串进行独有性检查.

默认a JSON.stringify- 使用基于字符串符——它另外区分 NaN编号 :Infinity编号 :-Infinity 从 null (裸着) JSON.stringify 否则就会崩溃 "null" 并总是返回真实 字符串,甚至对数值如 undefined 对其中 JSON.stringify 自动返回 undefined。 。 。 .

import { uniqueFactory } from '@dpaskhin/unique';
import { faker } from '@faker-js/faker';
import JsonMarshal from 'json-marshal';

const createUniqueUser = uniqueFactory(
  () => ({
    name: faker.person.firstName(),
    age: faker.number.int({ min: 18, max: 100 }),
  }),
  {
    // Here can be any function that takes the return value of the function provided above and converts it to a string.
    // Or just omit it to use the default stringifier described above.
    stringifier: JsonMarshal.stringify,
  }
);

const user1 = createUniqueUser();
const user2 = createUniqueUser();

// Outputs two unique users
console.log(user1, user2);

API 参考

唯一事实( fn, 选项)

创建一个功能,确保根据所提供的函数 fn 得出独特的结果.

参数

  • fn - 用于生成值的函数.
  • 选项 - 可选。 包含配置选项的对象 :
    • 存储 (Set):用于跟踪独特值的自定义商店. 默认为 a 新设置。 。 。 .
    • 最大存储量 (数字):在投出出出错前生成唯一值的最大重试次数. 默认为50.
    • 最大时间 (数字):在投出一个 错误。 默认为50ms.
    • 排除 (Array):从结果集中排除的数值列表. 这些值不会是 由唯一生成器返回.
    • 字符串 (函数):在存储结果之前将结果字符串的函数 。 默认为 a JSON.stringify- 基于 字符串( 见 复杂对象的字符串) (中文(简体) ).

回返

一个函数以相同的签名生成基于 fn 的独特值.

示例

import { uniqueFactory } from '@dpaskhin/unique';
import { faker } from '@faker-js/faker';

const createUniqueUser = uniqueFactory(() => ({
  name: faker.person.firstName(),
  age: faker.number.int({ min: 18, max: 100 }),
}));

// Outputs a unique user each time
console.log(createUniqueUser());
console.log(createUniqueUser());
console.log(createUniqueUser());

独有( fn, 参数, 选项)

通过运行 fn 和通过提供或全球商店确保独有性来生成一个独特的值.

参数

  • fn - 用于生成值的函数.
  • args - 可选. 一系列要传递到 fn 的参数 .
  • 选项 - 可选。 包含配置选项的对象 :
    • 存储 (Set):用于跟踪独特值的自定义商店. 默认情况下 全球 已使用.
    • 最大存储量 (数字):在投出出出错前生成唯一值的最大重试次数. 默认为50.
    • 最大时间 (数字):在投出一个 错误。 默认为50ms.
    • 排除 (Array):从结果集中排除的数值列表. 这些值不会是 由唯一生成器返回.
    • 字符串 (函数):在存储结果之前将结果字符串的函数 。 默认为 a JSON.stringify- 基于 字符串( 见 复杂对象的字符串) (中文(简体) ).

回返

由 fn 生成的独特值 .

示例

import { unique } from '@dpaskhin/unique';
import { faker } from '@faker-js/faker';

const uniqueEmail = unique(faker.internet.email, [
  {
    firstName: faker.person.firstName(),
    lastName: faker.person.lastName(),
  },
]);

// Outputs a unique email
console.log(uniqueEmail);

独有( 值, 选项)

通过检查所提供的或全球商店,确保纯值是独一无二的.

参数

  • 值 - 纯值(非功能性),以确保其独特性.
  • 选项 - 可选。 包含配置选项的对象 :
    • 存储 (Set):用于跟踪独特值的自定义商店. 默认情况下 全球 已使用.
    • 排除 (Array):要排除的数值列表. 这些值不会被添加到存储或返回 .
    • 字符串 (函数):一个在存储之前将值字符串的函数 。 默认为 a JSON.stringify- 基于 字符串( 见 复杂对象的字符串) (中文(简体) ).

回返

提供的独特价值.

示例

这个超载是用来检查您已经拥有的值—— 不是随机生成的值—— 对一个商店, 例如一发子弹 从用户输入中得出 :

import { unique } from '@dpaskhin/unique';

const usedSlugs = new Set();

function toSlug(title: string) {
  return unique(title.toLowerCase().replace(/\s+/g, '-'), { store: usedSlugs });
}

console.log(toSlug('Hello World')); // 'hello-world'
toSlug('Hello World'); // throws UniqueError — slug already taken

唯一错误

所抛出的错误类 uniqueFactory编号 :unique 当无法产生独特的价值时。 扩展 Error。 。 。 .

字段

  • 存储大小 (数字):商店在失败时所持有的数值数.
  • 会期 (数字):在放弃前曾尝试过多久(以毫秒计)的一代.
  • 重复次数 (数字):在放弃之前,生成器函数被调用多少次.

见 处理错误 以下为用法示例.

全球

模块级别 Set 用于 unique() 不提供习惯的电话 store 选项。 分享整个你 默认应用——见 全球存储 上文,以及 最佳做法 何时 避开它.

处理错误

uniqueFactory编号 :unique 丢出一个 UniqueError 当它们不能产生独特的价值时:

  • 用于基于函数的生成uniqueFactory(fn), (中文(简体) ), unique(fn, args)这一次 maxRetries 或者说 maxTime 超过.
  • 用于平价形式(unique(value)如果 value 已经在店里了.

UniqueError 以导出, 这样您就可以检查它, 而不是分析错误消息 :

import { unique, UniqueError } from '@dpaskhin/unique';

try {
  unique(() => Math.floor(Math.random() * 2), [], { maxRetries: 5 });
} catch (error) {
  if (error instanceof UniqueError) {
    console.error(error.message);
    console.error(error.storeSize, error.iterations, error.duration);
  }
}

最佳做法

  • 在需要本地特性时避免使用全球商店,因为它可能导致出乎意料的结果 由于共享状态.
  • 配置 Max Retries和超时: 根据预期的独特性和复杂性自定义最大 Retries和最大时间 的数值.
  • 避免使用纯值,更喜欢生成函数来进行灵活性和再试.

许可证

@dpaskhin/ 独一无二 根据麻省理工学院的许可证颁发执照.

捐款

欢迎捐款! 如果你有想法或改进,请随意提交拉动请求.

版本与发布记录

@dpaskhin/unique 共发布 6 个版本,首次发布于 2024/10/03;过去 12 个月发布了 1 个版本。

版本发布日期距今
1.1.0latest2026/07/104 个月前
1.0.02024/11/222 年前
0.3.02024/11/112 年前
0.2.02024/10/092 年前
0.1.02024/10/032 年前
0.0.02024/10/032 年前

关于 @dpaskhin/unique 的常见问题

@dpaskhin/unique 是什么?

通过拒绝重复来保证独特的值.

如何安装 @dpaskhin/unique?

在项目目录运行 npm install @dpaskhin/unique,或使用 pnpm add / yarn add / bun add。

@dpaskhin/unique 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@dpaskhin/unique 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@dpaskhin/unique 可以商用吗?

@dpaskhin/unique 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@dpaskhin/unique 的下载量有多少?

根据 npm 官方下载统计,@dpaskhin/unique 在 2026/10/13 – 2026/11/11 这 30 天内被下载 5,643 次,日均约 188 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@dpaskhin/unique 还在维护吗?

最新版本 1.1.0 发布于 2026/07/10(4 个月前);至今共发布 6 个版本,其中过去 12 个月发布了 1 个;首次发布于 2024/10/03。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。