aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorST-DDT <[email protected]>2022-02-10 23:52:14 +0100
committerGitHub <[email protected]>2022-02-10 23:52:14 +0100
commit14df7d3f70b54c4a153f5dcf111ef90575bbbe9e (patch)
tree2e7bc398eeb0c6312218f6ffe5d44876d7ab3bc5 /src
parent2a4f835db2a9c324c4d4a65a69c9469eaf9572de (diff)
downloadfaker-14df7d3f70b54c4a153f5dcf111ef90575bbbe9e.tar.xz
faker-14df7d3f70b54c4a153f5dcf111ef90575bbbe9e.zip
fix: fix unique method types (#457)
Diffstat (limited to 'src')
-rw-r--r--src/unique.ts13
-rw-r--r--src/vendor/unique.ts27
2 files changed, 22 insertions, 18 deletions
diff --git a/src/unique.ts b/src/unique.ts
index 3084da4b..62402df0 100644
--- a/src/unique.ts
+++ b/src/unique.ts
@@ -1,4 +1,5 @@
import * as uniqueExec from './vendor/unique';
+import type { RecordKey } from './vendor/unique';
/**
* Module to generate unique entries.
@@ -38,20 +39,20 @@ export class Unique {
* @param opts.compare The function used to determine whether a value was already returned.
*
* @example
- * faker.unique(faker.name.firstName())
+ * faker.unique(faker.name.firstName)
*/
- unique<Method extends (args: Args) => string, Args extends any[]>(
+ unique<Method extends (...parameters) => RecordKey>(
method: Method,
- args: Args,
+ args?: Parameters<Method>,
opts?: {
startTime?: number;
maxTime?: number;
maxRetries?: number;
currentIterations?: number;
- exclude?: string | string[];
- compare?: (obj: Record<string, string>, key: string) => 0 | -1;
+ exclude?: RecordKey | RecordKey[];
+ compare?: (obj: Record<RecordKey, RecordKey>, key: RecordKey) => 0 | -1;
}
- ): string {
+ ): ReturnType<Method> {
opts = opts || {};
opts.startTime = new Date().getTime();
if (typeof opts.maxTime !== 'number') {
diff --git a/src/vendor/unique.ts b/src/vendor/unique.ts
index 31056b03..0d6e6317 100644
--- a/src/vendor/unique.ts
+++ b/src/vendor/unique.ts
@@ -1,19 +1,24 @@
+export type RecordKey = string | number | symbol;
+
// global results store
// currently uniqueness is global to entire faker instance
// this means that faker should currently *never* return duplicate values across all API methods when using `Faker.unique`
// it's possible in the future that some users may want to scope found per function call instead of faker instance
-const found: Record<string, string> = {};
+const found: Record<RecordKey, RecordKey> = {};
// global exclude list of results
// defaults to nothing excluded
-const exclude: string[] = [];
+const exclude: RecordKey[] = [];
// current iteration or retries of unique.exec ( current loop depth )
const currentIterations = 0;
// uniqueness compare function
// default behavior is to check value as key against object hash
-function defaultCompare<T, Key extends keyof T>(obj: T, key: Key): 0 | -1 {
+function defaultCompare(
+ obj: Record<RecordKey, RecordKey>,
+ key: RecordKey
+): 0 | -1 {
if (typeof obj[key] === 'undefined') {
return -1;
}
@@ -42,20 +47,18 @@ function errorMessage(
);
}
-// TODO @Shinigami92 2022-01-24: We should investigate deeper into the types
-// Especially the `opts.compare` parameter and `Result` type
-export function exec<Method extends (args: Args) => string, Args extends any[]>(
+export function exec<Method extends (...parameters) => RecordKey>(
method: Method,
- args: Args,
+ args: Parameters<Method>,
opts: {
maxTime?: number;
maxRetries?: number;
- exclude?: string | string[];
- compare?: (obj: Record<string, string>, key: string) => 0 | -1;
+ exclude?: RecordKey | RecordKey[];
+ compare?: (obj: Record<RecordKey, RecordKey>, key: RecordKey) => 0 | -1;
currentIterations?: number;
startTime?: number;
}
-): string {
+): ReturnType<Method> {
const now = new Date().getTime();
opts = opts || {};
@@ -75,7 +78,7 @@ export function exec<Method extends (args: Args) => string, Args extends any[]>(
const startTime = opts.startTime;
// support single exclude argument as string
- if (typeof opts.exclude === 'string') {
+ if (!Array.isArray(opts.exclude)) {
opts.exclude = [opts.exclude];
}
@@ -103,7 +106,7 @@ export function exec<Method extends (args: Args) => string, Args extends any[]>(
}
// execute the provided method to find a potential satisfied value
- const result: string = method.apply(this, args);
+ const result: ReturnType<Method> = method.apply(this, args);
// if the result has not been previously found, add it to the found array and return the value as it's unique
if (