@taicode/common-base 1.5.0 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,9 +1,21 @@
1
1
  type CatchType<F extends () => unknown> = F extends () => PromiseLike<infer R> ? R : F extends () => infer R ? R : never;
2
+ /**
3
+ * 成功结果类型:[result, undefined]
4
+ */
5
+ export type CatchSuccess<T> = [T, undefined];
6
+ /**
7
+ * 失败结果类型:[undefined, error]
8
+ */
9
+ export type CatchFailure = [undefined, unknown];
10
+ /**
11
+ * 捕获结果联合类型,提供更好的类型判断
12
+ */
13
+ export type CatchResult<T> = CatchSuccess<T> | CatchFailure;
2
14
  /**
3
15
  * 通用错误捕获函数,支持 PromiseLike 和函数执行
4
- * 将结果转换成 [result, error] 的形式
16
+ * 返回 [result, error] 的联合类型,便于类型判断
5
17
  */
6
- export declare function catchIt<T>(input: PromiseLike<T>): Promise<[T | undefined, unknown]>;
7
- export declare function catchIt<F extends () => unknown>(input: F): Promise<[CatchType<F> | undefined, unknown]>;
18
+ export declare function catchIt<T>(input: PromiseLike<T>): Promise<CatchResult<T>>;
19
+ export declare function catchIt<F extends () => unknown>(input: F): Promise<CatchResult<CatchType<F>>>;
8
20
  export {};
9
21
  //# sourceMappingURL=catch.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"catch.d.ts","sourceRoot":"","sources":["../../source/catch/catch.ts"],"names":[],"mappings":"AAKA,KAAK,SAAS,CAAC,CAAC,SAAS,MAAM,OAAO,IAAI,CAAC,SAAS,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,MAAM,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;AAExH;;;GAGG;AACH,wBAAsB,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,EAAE,OAAO,CAAC,CAAC,CAAA;AAC1F,wBAAsB,OAAO,CAAC,CAAC,SAAS,MAAM,OAAO,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,EAAE,OAAO,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"catch.d.ts","sourceRoot":"","sources":["../../source/catch/catch.ts"],"names":[],"mappings":"AAKA,KAAK,SAAS,CAAC,CAAC,SAAS,MAAM,OAAO,IAAI,CAAC,SAAS,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,MAAM,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;AAExH;;GAEG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,SAAS,CAAC,CAAA;AAE5C;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;AAE/C;;GAEG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,CAAA;AAE3D;;;GAGG;AACH,wBAAsB,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA;AAChF,wBAAsB,OAAO,CAAC,CAAC,SAAS,MAAM,OAAO,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA"}
@@ -3,13 +3,11 @@ function isPromiseLike(value) {
3
3
  return value != null && typeof value === 'object' && 'then' in value && typeof value.then === 'function';
4
4
  }
5
5
  export async function catchIt(input) {
6
- const returned = [undefined, undefined];
7
6
  try {
8
7
  if (isPromiseLike(input)) {
9
8
  // 处理 PromiseLike
10
- await Promise.resolve(input)
11
- .then((result) => (returned[0] = result))
12
- .catch((error) => (returned[1] = error));
9
+ const result = await Promise.resolve(input);
10
+ return [result, undefined];
13
11
  }
14
12
  else if (typeof input === 'function') {
15
13
  // 处理函数
@@ -19,12 +17,13 @@ export async function catchIt(input) {
19
17
  return catchIt(result);
20
18
  }
21
19
  else {
22
- returned[0] = result;
20
+ return [result, undefined];
23
21
  }
24
22
  }
25
23
  }
26
24
  catch (error) {
27
- returned[1] = error;
25
+ return [undefined, error];
28
26
  }
29
- return returned;
27
+ // 这里不应该到达,但为了类型安全
28
+ return [undefined, new Error('Unexpected input type')];
30
29
  }
@@ -360,4 +360,31 @@ describe('catchIt', () => {
360
360
  expect(error).toBeUndefined();
361
361
  });
362
362
  });
363
+ describe('类型判断优化', () => {
364
+ it('应该支持联合类型的类型判断', async () => {
365
+ // 成功情况的类型判断
366
+ const successResult = await catchIt(Promise.resolve('success'));
367
+ if (successResult[1] === undefined) {
368
+ // 在这个分支中,TypeScript 应该能够推断出 successResult[0] 是 string 类型
369
+ expect(typeof successResult[0]).toBe('string');
370
+ expect(successResult[0]).toBe('success');
371
+ }
372
+ // 失败情况的类型判断
373
+ const failureResult = await catchIt(Promise.reject(new Error('failed')));
374
+ if (failureResult[0] === undefined) {
375
+ // 在这个分支中,TypeScript 应该能够推断出 failureResult[1] 是 unknown 类型
376
+ expect(failureResult[1]).toBeInstanceOf(Error);
377
+ expect(failureResult[1].message).toBe('failed');
378
+ }
379
+ });
380
+ it('应该支持函数的类型判断', async () => {
381
+ const fn = () => 42;
382
+ const result = await catchIt(fn);
383
+ if (result[1] === undefined) {
384
+ // 成功情况下,result[0] 应该是 number 类型
385
+ expect(typeof result[0]).toBe('number');
386
+ expect(result[0]).toBe(42);
387
+ }
388
+ });
389
+ });
363
390
  });
@@ -61,20 +61,20 @@ type SystemErrorType = keyof SystemErrorTypes extends never ? string : Extract<k
61
61
  type UserErrorContext<T extends string> = T extends keyof UserErrorTypes ? UserErrorTypes[T] & ErrorContext : ErrorContext;
62
62
  type SystemErrorContext<T extends string> = T extends keyof SystemErrorTypes ? SystemErrorTypes[T] & ErrorContext : ErrorContext;
63
63
  /** 用户可见的错误 */
64
- export declare class UserError<T extends string = UserErrorType> extends Error {
64
+ export declare class UserError<T extends UserErrorType = UserErrorType> extends Error {
65
65
  type: T;
66
66
  message: string;
67
67
  context?: UserErrorContext<T> | undefined;
68
68
  constructor(type: T, message?: string, context?: UserErrorContext<T> | undefined);
69
- static is<T extends string = UserErrorType>(error: unknown): error is UserError<T>;
69
+ static is<T extends UserErrorType = UserErrorType>(error: unknown): error is UserError<T>;
70
70
  }
71
71
  /** 系统错误 */
72
- export declare class SystemError<T extends string = SystemErrorType> extends Error {
72
+ export declare class SystemError<T extends SystemErrorType = SystemErrorType> extends Error {
73
73
  type: T;
74
74
  message: string;
75
75
  context?: SystemErrorContext<T> | undefined;
76
76
  constructor(type: T, message?: string, context?: SystemErrorContext<T> | undefined);
77
- static is<T extends string = SystemErrorType>(error: unknown): error is SystemError<T>;
77
+ static is<T extends SystemErrorType = SystemErrorType>(error: unknown): error is SystemError<T>;
78
78
  }
79
79
  export declare class UnknownError extends Error {
80
80
  context?: ErrorContext | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../source/error/error.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AAEH,UAAU,YAAY;IACpB,2BAA2B;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAID,MAAM,WAAW,cAAc;CAAG;AAClC,MAAM,WAAW,gBAAgB;CAAG;AAGpC,KAAK,aAAa,GAAG,MAAM,cAAc,SAAS,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,cAAc,EAAE,MAAM,CAAC,CAAA;AACxG,KAAK,eAAe,GAAG,MAAM,gBAAgB,SAAS,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,gBAAgB,EAAE,MAAM,CAAC,CAAA;AAG9G,KAAK,gBAAgB,CAAC,CAAC,SAAS,MAAM,IAAI,CAAC,SAAS,MAAM,cAAc,GACpE,cAAc,CAAC,CAAC,CAAC,GAAG,YAAY,GAChC,YAAY,CAAA;AAEhB,KAAK,kBAAkB,CAAC,CAAC,SAAS,MAAM,IAAI,CAAC,SAAS,MAAM,gBAAgB,GACxE,gBAAgB,CAAC,CAAC,CAAC,GAAG,YAAY,GAClC,YAAY,CAAA;AAEhB,cAAc;AACd,qBAAa,SAAS,CAAC,CAAC,SAAS,MAAM,GAAG,aAAa,CAAE,SAAQ,KAAK;IACjD,IAAI,EAAE,CAAC;IAAS,OAAO,EAAE,MAAM;IAAc,OAAO,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC;gBAA1E,IAAI,EAAE,CAAC,EAAS,OAAO,GAAE,MAAW,EAAS,OAAO,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,YAAA;IAK7F,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,MAAM,GAAG,aAAa,EAAE,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,SAAS,CAAC,CAAC,CAAC;CAGnF;AAED,WAAW;AACX,qBAAa,WAAW,CAAC,CAAC,SAAS,MAAM,GAAG,eAAe,CAAE,SAAQ,KAAK;IACrD,IAAI,EAAE,CAAC;IAAS,OAAO,EAAE,MAAM;IAAc,OAAO,CAAC,EAAE,kBAAkB,CAAC,CAAC,CAAC;gBAA5E,IAAI,EAAE,CAAC,EAAS,OAAO,GAAE,MAAW,EAAS,OAAO,CAAC,EAAE,kBAAkB,CAAC,CAAC,CAAC,YAAA;IAK/F,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,MAAM,GAAG,eAAe,EAAE,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,WAAW,CAAC,CAAC,CAAC;CAGvF;AAED,qBAAa,YAAa,SAAQ,KAAK;IACD,OAAO,CAAC,EAAE,YAAY;gBAA9C,OAAO,EAAE,MAAM,EAAS,OAAO,CAAC,EAAE,YAAY,YAAA;IAK1D,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,YAAY;CAGjD"}
1
+ {"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../source/error/error.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AAEH,UAAU,YAAY;IACpB,2BAA2B;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAID,MAAM,WAAW,cAAc;CAAG;AAClC,MAAM,WAAW,gBAAgB;CAAG;AAGpC,KAAK,aAAa,GAAG,MAAM,cAAc,SAAS,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,cAAc,EAAE,MAAM,CAAC,CAAA;AACxG,KAAK,eAAe,GAAG,MAAM,gBAAgB,SAAS,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,gBAAgB,EAAE,MAAM,CAAC,CAAA;AAG9G,KAAK,gBAAgB,CAAC,CAAC,SAAS,MAAM,IAAI,CAAC,SAAS,MAAM,cAAc,GACpE,cAAc,CAAC,CAAC,CAAC,GAAG,YAAY,GAChC,YAAY,CAAA;AAEhB,KAAK,kBAAkB,CAAC,CAAC,SAAS,MAAM,IAAI,CAAC,SAAS,MAAM,gBAAgB,GACxE,gBAAgB,CAAC,CAAC,CAAC,GAAG,YAAY,GAClC,YAAY,CAAA;AAEhB,cAAc;AACd,qBAAa,SAAS,CAAC,CAAC,SAAS,aAAa,GAAG,aAAa,CAAE,SAAQ,KAAK;IACxD,IAAI,EAAE,CAAC;IAAS,OAAO,EAAE,MAAM;IAAc,OAAO,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC;gBAA1E,IAAI,EAAE,CAAC,EAAS,OAAO,GAAE,MAAW,EAAS,OAAO,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,YAAA;IAK7F,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,aAAa,GAAG,aAAa,EAAE,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,SAAS,CAAC,CAAC,CAAC;CAG1F;AAED,WAAW;AACX,qBAAa,WAAW,CAAC,CAAC,SAAS,eAAe,GAAG,eAAe,CAAE,SAAQ,KAAK;IAC9D,IAAI,EAAE,CAAC;IAAS,OAAO,EAAE,MAAM;IAAc,OAAO,CAAC,EAAE,kBAAkB,CAAC,CAAC,CAAC;gBAA5E,IAAI,EAAE,CAAC,EAAS,OAAO,GAAE,MAAW,EAAS,OAAO,CAAC,EAAE,kBAAkB,CAAC,CAAC,CAAC,YAAA;IAK/F,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,eAAe,GAAG,eAAe,EAAE,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,WAAW,CAAC,CAAC,CAAC;CAGhG;AAED,qBAAa,YAAa,SAAQ,KAAK;IACD,OAAO,CAAC,EAAE,YAAY;gBAA9C,OAAO,EAAE,MAAM,EAAS,OAAO,CAAC,EAAE,YAAY,YAAA;IAK1D,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,YAAY;CAGjD"}
@@ -1,2 +1,19 @@
1
+ declare module './error' {
2
+ interface UserErrorTypes {
3
+ VALIDATION_ERROR: unknown;
4
+ TEST_ERROR: unknown;
5
+ USER_ERROR: unknown;
6
+ REQUIRED_FIELD: unknown;
7
+ INVALID_FORMAT: unknown;
8
+ OUT_OF_RANGE: unknown;
9
+ }
10
+ interface SystemErrorTypes {
11
+ DATABASE_ERROR: unknown;
12
+ NETWORK_ERROR: unknown;
13
+ FILE_ERROR: unknown;
14
+ TEST_ERROR: unknown;
15
+ SYSTEM_ERROR: unknown;
16
+ }
17
+ }
1
18
  export {};
2
19
  //# sourceMappingURL=error.test.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"error.test.d.ts","sourceRoot":"","sources":["../../source/error/error.test.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"error.test.d.ts","sourceRoot":"","sources":["../../source/error/error.test.ts"],"names":[],"mappings":"AAGA,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAU,cAAc;QACtB,gBAAgB,EAAE,OAAO,CAAA;QACzB,UAAU,EAAE,OAAO,CAAA;QACnB,UAAU,EAAE,OAAO,CAAA;QACnB,cAAc,EAAE,OAAO,CAAA;QACvB,cAAc,EAAE,OAAO,CAAA;QACvB,YAAY,EAAE,OAAO,CAAA;KACtB;IAED,UAAU,gBAAgB;QACxB,cAAc,EAAE,OAAO,CAAA;QACvB,aAAa,EAAE,OAAO,CAAA;QACtB,UAAU,EAAE,OAAO,CAAA;QACnB,UAAU,EAAE,OAAO,CAAA;QACnB,YAAY,EAAE,OAAO,CAAA;KACtB;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@taicode/common-base",
3
- "version": "1.5.0",
3
+ "version": "1.6.0",
4
4
  "author": "Alain",
5
5
  "license": "ISC",
6
6
  "description": "",
@@ -21,6 +21,7 @@
21
21
  "scripts": {
22
22
  "test": "vitest run",
23
23
  "build": "tsc -p tsconfig.json",
24
+ "prepublishOnly": "npm run build",
24
25
  "dev": "tsc -p tsconfig.json --watch"
25
26
  },
26
27
  "files": [