a-calc 3.0.0-beta.2025120808 → 3.0.0-beta.20260105

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.
package/calc.d.ts CHANGED
@@ -96,6 +96,38 @@ export type CalcSum = <const Expr extends string | number, const Fmt extends str
96
96
  string | Err
97
97
  );
98
98
 
99
+ /**
100
+ * fmt 格式化选项
101
+ */
102
+ export interface FmtOptions {
103
+ _error?: any;
104
+ _fmt?: string;
105
+ _volume_units?: string[];
106
+ _volume_step?: number;
107
+ _presets?: Record<string, any>;
108
+ _unit_to?: Record<string, any>;
109
+ _unit_from?: Record<string, any>;
110
+ _unit_default_to?: string | string[];
111
+ _unit_default_from?: string | string[];
112
+ _unit_position?: 'before' | 'after' | 'middle';
113
+ _unit_positions?: Record<string, 'before' | 'after' | 'middle'>;
114
+ _thousands_presets?: Record<string, any>;
115
+ _unit_thousands?: Record<string, string>;
116
+ [key: string]: any;
117
+ }
118
+
119
+ /**
120
+ * fmt 函数类型
121
+ * 直接格式化数字,跳过表达式解析
122
+ */
123
+ export interface Fmt {
124
+ <const FmtStr extends string | undefined = undefined, const Err = never>(
125
+ value: number | string,
126
+ format_str?: FmtStr,
127
+ options?: FmtOptions & { _error?: Err }
128
+ ): If_StrIncludes<FmtStr, ["!n"]> extends true ? number | Err : string | Err;
129
+ }
130
+
99
131
  export interface CalcWrap
100
132
  {
101
133
  <const Expr extends string | number>
@@ -150,12 +182,33 @@ export const calc: Calc;
150
182
  */
151
183
  export const calc_sum: CalcSum;
152
184
  /**
153
- * calc方法的别名.传入字符串算术式或数字返回计算的结果
154
- * @param expr 一个字符串算术式或一个数字
155
- * @param options 一个配置或者用来填充算术式的数据源,或者两者的结合
156
- * @returns 返回进过计算和格式化之后的结果,结果可能是字符串或数字或自定义的错误类型
185
+ * 专用格式化函数,用于对数字进行格式化处理
186
+ * 相比 calc,它跳过表达式解析,性能更好
187
+ *
188
+ * 支持多种调用方式:
189
+ * 1. 新 API: fmt(100, '=2') - 直接格式化数字,性能最好
190
+ * 2. 旧 API: fmt('100 | =2') - calc 风格(向后兼容)
191
+ * 3. 旧 API: fmt(100, { _fmt: '=2' }) - 对象选项风格(向后兼容)
192
+ *
193
+ * @param value 要格式化的数字,或包含 | 的 calc 风格表达式
194
+ * @param format_str 格式化字符串,或选项对象(旧 API 兼容)
195
+ * @param options 可选配置项
196
+ * @returns 返回格式化后的结果
197
+ *
198
+ * @example:
199
+ * ```typescript
200
+ * // 新 API(推荐)
201
+ * fmt(100, '=2') // '100.00'
202
+ * fmt(1234567, ',') // '1,234,567'
203
+ * fmt(0.1234, '%=2') // '12.34%'
204
+ *
205
+ * // 旧 API(向后兼容)
206
+ * fmt('100 | =2') // '100.00'
207
+ * fmt('num | ,', { num: 1234567 }) // '1,234,567'
208
+ * fmt(100, { _fmt: '=2' }) // '100.00'
209
+ * ```
157
210
  */
158
- export const fmt: Calc;
211
+ export const fmt: Fmt;
159
212
  /**
160
213
  * calc方法的包装版本,除了支持calc所有的功能还额外提供了更强大的类型推导和更灵活的编写方式
161
214
  * @param expr 一个字符串算术式或一个数字
@@ -175,89 +228,333 @@ declare const version: string;
175
228
 
176
229
  export const parse_thousands: (str: string) => string;
177
230
 
231
+ // ==================== 原始运算函数类型 ====================
232
+
233
+ type NumOrStr = number | string;
234
+ type TypeArg = "number" | "string";
235
+
178
236
  /**
179
- * 传入两个数字或数字字符串进行相加并返回结果,可以指定第三个参数控制返回数字还是数字字符串
180
- * @param a 一个数字或数字字符串
181
- * @param b 另一个数字或数字字符串
182
- * @param type 输出数字还是字符串
183
- * @returns 计算得到的结果
237
+ * 二元运算函数类型(支持多参数)
238
+ * - 默认返回 number
239
+ * - 最后一个参数为 "string" 时返回 string
240
+ * - 最后一个参数为 "number" 时返回 number
184
241
  */
185
- export const plus: <const T extends "number" | "string" = "number">(a: number|string, b: number|string, type?: T) => T extends "number" ? number : string;
242
+ interface BinaryOp {
243
+ // 无参数
244
+ (): number;
245
+ // 单参数
246
+ (a: NumOrStr): number;
247
+ (a: NumOrStr, type: "string"): string;
248
+ (a: NumOrStr, type: "number"): number;
249
+ // 双参数(兼容旧版)
250
+ (a: NumOrStr, b: NumOrStr): number;
251
+ (a: NumOrStr, b: NumOrStr, type: "string"): string;
252
+ (a: NumOrStr, b: NumOrStr, type: "number"): number;
253
+ // 三参数
254
+ (a: NumOrStr, b: NumOrStr, c: NumOrStr): number;
255
+ (a: NumOrStr, b: NumOrStr, c: NumOrStr, type: "string"): string;
256
+ (a: NumOrStr, b: NumOrStr, c: NumOrStr, type: "number"): number;
257
+ // 四参数
258
+ (a: NumOrStr, b: NumOrStr, c: NumOrStr, d: NumOrStr): number;
259
+ (a: NumOrStr, b: NumOrStr, c: NumOrStr, d: NumOrStr, type: "string"): string;
260
+ (a: NumOrStr, b: NumOrStr, c: NumOrStr, d: NumOrStr, type: "number"): number;
261
+ // 更多参数(fallback)
262
+ (...args: NumOrStr[]): number | string;
263
+ }
264
+
186
265
  /**
187
- * 传入两个数字或数字字符串进行相减并返回结果,可以指定第三个参数控制返回数字还是数字字符串
188
- * @param a 一个数字或数字字符串
189
- * @param b 另一个数字或数字字符串
190
- * @param type 输出数字还是字符串
191
- * @returns 计算得到的结果
266
+ * 一元运算函数类型
192
267
  */
193
- export const sub: <const T extends "number" | "string" = "number">(a: number|string, b: number|string, type?: T) => T extends "number" ? number : string;
268
+ interface UnaryOp {
269
+ (value: NumOrStr): number;
270
+ (value: NumOrStr, type: "string"): string;
271
+ (value: NumOrStr, type: "number"): number;
272
+ }
273
+
194
274
  /**
195
- * 传入两个数字或数字字符串进行相乘并返回结果,可以指定第三个参数控制返回数字还是数字字符串
196
- * @param a 一个数字或数字字符串
197
- * @param b 另一个数字或数字字符串
198
- * @param type 输出数字还是字符串
199
- * @returns 计算得到的结果
275
+ * 加法 - 支持多参数
276
+ * @example
277
+ * add(1, 2) // => 3 (number)
278
+ * add(1, 2, 3, 4) // => 10 (number)
279
+ * add(1, 2, "string") // => "3" (string)
200
280
  */
201
- export const mul: <const T extends "number" | "string" = "number">(a: number|string, b: number|string, type?: T) => T extends "number" ? number : string;
281
+ export const add: BinaryOp;
282
+
202
283
  /**
203
- * 传入两个数字或数字字符串进行相除并返回结果,可以指定第三个参数控制返回数字还是数字字符串
204
- * @param a 一个数字或数字字符串
205
- * @param b 另一个数字或数字字符串
206
- * @param type 输出数字还是字符串
207
- * @returns 计算得到的结果
284
+ * 减法 - 支持多参数
285
+ * @example
286
+ * sub(10, 3) // => 7 (number)
287
+ * sub(10, 3, 2) // => 5 (number)
288
+ * sub(10, 3, "string") // => "7" (string)
208
289
  */
209
- export const div: <const T extends "number" | "string" = "number">(a: number|string, b: number|string, type?: T) => T extends "number" ? number : string;
290
+ export const sub: BinaryOp;
291
+
210
292
  /**
211
- * 传入两个数字或数字字符串进行整除并返回结果,可以指定第三个参数控制返回数字还是数字字符串
212
- * @param a 一个数字或数字字符串
213
- * @param b 另一个数字或数字字符串
214
- * @param type 输出数字还是字符串
215
- * @returns 计算得到的结果
293
+ * 乘法 - 支持多参数
294
+ * @example
295
+ * mul(2, 3) // => 6 (number)
296
+ * mul(2, 3, 4) // => 24 (number)
297
+ * mul(2, 3, "string") // => "6" (string)
216
298
  */
217
- export const idiv: <const T extends "number" | "string" = "number">(a: number|string, b: number|string, type?: T) => T extends "number" ? number : string;
299
+ export const mul: BinaryOp;
300
+
218
301
  /**
219
- * 传入两个数字或数字字符串进行幂运算并返回结果,可以指定第三个参数控制返回数字还是数字字符串
220
- * @param a 一个数字或数字字符串
221
- * @param b 另一个数字或数字字符串
222
- * @param type 输出数字还是字符串
223
- * @returns 计算得到的结果
302
+ * 除法 - 支持多参数
303
+ * @example
304
+ * div(100, 2) // => 50 (number)
305
+ * div(100, 2, 5) // => 10 (number)
306
+ * div(10, 0) // throws Error or returns _error
224
307
  */
225
- export const pow: <const T extends "number" | "string" = "number">(a: number|string, b: number|string, type?: T) => T extends "number" ? number : string;
308
+ export const div: BinaryOp;
309
+
226
310
  /**
227
- * 传入两个数字或数字字符串进行取模并返回结果,可以指定第三个参数控制返回数字还是数字字符串
228
- * @param a 一个数字或数字字符串
229
- * @param b 另一个数字或数字字符串
230
- * @param type 输出数字还是字符串
231
- * @returns 计算得到的结果
311
+ * 取模 - 支持多参数
312
+ * @example
313
+ * mod(10, 3) // => 1 (number)
314
+ * mod(10, 3, "string") // => "1" (string)
232
315
  */
233
- export const mod: <const T extends "number" | "string" = "number">(a: number|string, b: number|string, type?: T) => T extends "number" ? number : string;
316
+ export const mod: BinaryOp;
234
317
 
235
318
  /**
236
- * calc方法的精简版本,去除了对单位计算的支持但是这个方法性能更好一些,该方法永远不会报错,在计算出错的时候返回 -
237
- * @param expr 一个字符串计算式或数字,如果是计算式那么内部的所有单元都需要使用一个空格严格分割
238
- * @param fmt_expr 一个用于描述如何格式化计算结果的字符串表达式
239
- * @param data 用于填充算术式中变量的数据源可以是对象也可以是对象数组
240
- * @param err_value 计算错误时返回的结果,模式是 -
241
- * @returns string | number | Err
319
+ * 幂运算 - 支持多参数(右结合)
320
+ * @example
321
+ * pow(2, 3) // => 8 (number)
322
+ * pow(2, 3, 2) // => 512 (number) = 2^(3^2)
242
323
  */
243
- export const calc_lite: <const T extends string | null | undefined, const Err = "-">
244
- (calc_expr: string | number, fmt_expr?: T, data?: any, err_value?: Err) =>
245
- (
246
- Or<Equal<T, null> | Equal<T, undefined>> extends true ?
247
- ( string | Err )
248
- :
249
- (
250
- If_StrIncludes<T, ["!n"]> extends true ?
251
- number | Err
252
- :
253
- string | Err
254
- )
255
- )
324
+ export const pow: BinaryOp;
325
+
256
326
  /**
257
- * 较为原始的计算方法,使用中缀表达式的顺序来传入参数
258
- * @param value1 计算数1
259
- * @param op "+" | "-" | "*" | "/" | "%" | "**" | "//"
260
- * @param value2 计算数2
261
- * @returns 计算结果
327
+ * 整除 - 支持多参数
328
+ * @example
329
+ * idiv(10, 3) // => 3 (number)
330
+ * idiv(100, 7, 2) // => 7 (number)
262
331
  */
263
- export const calc_mini: (value1: number | string, op: "+" | "-" | "*" | "/" | "%" | "**" | "//", value2: number | string) => string
332
+ export const idiv: BinaryOp;
333
+
334
+ /**
335
+ * 绝对值
336
+ * @example
337
+ * abs(-5) // => 5 (number)
338
+ * abs(-5, "string") // => "5" (string)
339
+ */
340
+ export const abs: UnaryOp;
341
+
342
+ /**
343
+ * 取负
344
+ * @example
345
+ * neg(5) // => -5 (number)
346
+ * neg(-5, "string") // => "5" (string)
347
+ */
348
+ export const neg: UnaryOp;
349
+
350
+ /**
351
+ * 平方根
352
+ * @example
353
+ * sqrt(16) // => 4 (number)
354
+ * sqrt(2, "string") // => "1.4142135623730950488" (string)
355
+ */
356
+ export const sqrt: UnaryOp;
357
+
358
+ /**
359
+ * 自然对数
360
+ * @example
361
+ * ln(Math.E) // => 1 (number)
362
+ * ln(10, "string") // => "2.302585..." (string)
363
+ */
364
+ export const ln: UnaryOp;
365
+
366
+ /**
367
+ * e 的 x 次方
368
+ * @example
369
+ * exp(1) // => 2.718281828... (number)
370
+ * exp(0, "string") // => "1" (string)
371
+ */
372
+ export const exp: UnaryOp;
373
+
374
+ // ==================== 计算模式 ====================
375
+
376
+ /**
377
+ * 计算模式类型
378
+ */
379
+ export type ComputeMode = 'decimal' | 'bigint' | 'wasm';
380
+
381
+ /**
382
+ * 角度单位类型
383
+ */
384
+ export type AngleUnit = 'deg' | 'rad';
385
+
386
+ /**
387
+ * 全局配置项
388
+ */
389
+ export interface CalcConfig {
390
+ /** 计算模式: "decimal" | "bigint" | "wasm" */
391
+ _compute_mode?: ComputeMode;
392
+ /** 角度单位: "deg" (度) | "rad" (弧度),默认 "deg" */
393
+ _angle_unit?: AngleUnit;
394
+ /** 除法精度(小数位数),默认 20 */
395
+ _div_precision?: number;
396
+ /** 错误时的返回值 */
397
+ _error?: any;
398
+ /** 是否启用调试模式控制台输出,默认 true */
399
+ _debug_console?: boolean;
400
+ /** 自定义函数映射 */
401
+ _custom_functions?: Record<string, (...args: any[]) => any>;
402
+ /** 其他自定义配置 */
403
+ [key: string]: any;
404
+ }
405
+
406
+ /**
407
+ * 设置全局配置
408
+ * @param config 配置对象
409
+ * @example
410
+ * set_config({ _compute_mode: 'bigint' }) // 切换到 BigInt 模式
411
+ * set_config({ _angle_unit: 'rad' }) // 使用弧度制
412
+ * set_config({ _div_precision: 30 }) // 设置除法精度为 30 位
413
+ * set_config({ _error: 0 }) // 错误时返回 0
414
+ */
415
+ export function set_config(config: CalcConfig): void;
416
+
417
+ /**
418
+ * 获取全局配置
419
+ * @param key 配置项名称,不传则返回全部配置
420
+ * @returns 配置值或全部配置对象
421
+ * @example
422
+ * get_config('_compute_mode') // => 'decimal'
423
+ * get_config() // => { _compute_mode: 'decimal', ... }
424
+ */
425
+ export function get_config(): CalcConfig;
426
+ export function get_config<K extends keyof CalcConfig>(key: K): CalcConfig[K];
427
+
428
+ /**
429
+ * 运算符方法类型(内部使用,通过 r* 函数访问)
430
+ */
431
+ export interface Ops {
432
+ // 基础运算
433
+ add: (a: string, b: string) => string;
434
+ sub: (a: string, b: string) => string;
435
+ mul: (a: string, b: string) => string;
436
+ div: (a: string, b: string) => string;
437
+ mod: (a: string, b: string) => string;
438
+ pow: (a: string, b: string) => string;
439
+ idiv: (a: string, b: string) => string;
440
+ // 一元运算
441
+ abs: (a: string) => string;
442
+ neg: (a: string) => string;
443
+ sqrt: (a: string) => string;
444
+ cbrt: (a: string) => string;
445
+ // 指数对数
446
+ exp: (a: string) => string;
447
+ ln: (a: string) => string;
448
+ log: (a: string, base: string) => string;
449
+ log2: (a: string) => string;
450
+ log10: (a: string) => string;
451
+ // 三角函数
452
+ sin: (a: string) => string;
453
+ cos: (a: string) => string;
454
+ tan: (a: string) => string;
455
+ asin: (a: string) => string;
456
+ acos: (a: string) => string;
457
+ atan: (a: string) => string;
458
+ // 双曲函数
459
+ sinh: (a: string) => string;
460
+ cosh: (a: string) => string;
461
+ tanh: (a: string) => string;
462
+ asinh: (a: string) => string;
463
+ acosh: (a: string) => string;
464
+ atanh: (a: string) => string;
465
+ // 取整
466
+ floor: (a: string) => string;
467
+ ceil: (a: string) => string;
468
+ trunc: (a: string) => string;
469
+ round: (a: string) => string;
470
+ // 比较
471
+ max: (a: string, b: string) => string;
472
+ min: (a: string, b: string) => string;
473
+ compare: (a: string, b: string) => number;
474
+ eq: (a: string, b: string) => boolean;
475
+ lt: (a: string, b: string) => boolean;
476
+ gt: (a: string, b: string) => boolean;
477
+ lte: (a: string, b: string) => boolean;
478
+ gte: (a: string, b: string) => boolean;
479
+ }
480
+
481
+ /**
482
+ * 加载 WASM 模块(异步)
483
+ * @returns Promise,加载完成后 resolve
484
+ */
485
+ export function load_wasm(): Promise<any>;
486
+
487
+ /**
488
+ * 检查 WASM 模块是否已加载
489
+ * @returns 是否已加载
490
+ */
491
+ export function is_wasm_loaded(): boolean;
492
+
493
+ /**
494
+ * WASM 表达式计算
495
+ * 直接传入复杂表达式字符串,内部完成解析和计算
496
+ * @param expr 表达式字符串
497
+ * @returns 计算结果字符串
498
+ * @example
499
+ * wcalc("1 + 2 * 3") // => "7"
500
+ * wcalc("sqrt(16) + pow(2, 3)") // => "12"
501
+ */
502
+ export function wcalc(expr: string): string;
503
+
504
+ // ==================== r 前缀原始运算函数 ====================
505
+ // 这些函数直接调用底层计算模式,字符串进字符串出,会跟随 _compute_mode 配置变化
506
+ // 切换计算模式请使用: set_config({ _compute_mode: 'bigint' })
507
+
508
+ // 基础运算
509
+ export function radd(a: string, b: string): string;
510
+ export function rsub(a: string, b: string): string;
511
+ export function rmul(a: string, b: string): string;
512
+ export function rdiv(a: string, b: string): string;
513
+ export function rmod(a: string, b: string): string;
514
+ export function rpow(a: string, b: string): string;
515
+ export function ridiv(a: string, b: string): string;
516
+
517
+ // 一元运算
518
+ export function rabs(a: string): string;
519
+ export function rneg(a: string): string;
520
+ export function rsqrt(a: string): string;
521
+ export function rcbrt(a: string): string;
522
+
523
+ // 指数对数
524
+ export function rexp(a: string): string;
525
+ export function rln(a: string): string;
526
+ export function rlog(a: string, base: string): string;
527
+ export function rlog2(a: string): string;
528
+ export function rlog10(a: string): string;
529
+
530
+ // 三角函数
531
+ export function rsin(a: string): string;
532
+ export function rcos(a: string): string;
533
+ export function rtan(a: string): string;
534
+ export function rasin(a: string): string;
535
+ export function racos(a: string): string;
536
+ export function ratan(a: string): string;
537
+
538
+ // 双曲函数
539
+ export function rsinh(a: string): string;
540
+ export function rcosh(a: string): string;
541
+ export function rtanh(a: string): string;
542
+ export function rasinh(a: string): string;
543
+ export function racosh(a: string): string;
544
+ export function ratanh(a: string): string;
545
+
546
+ // 取整
547
+ export function rfloor(a: string): string;
548
+ export function rceil(a: string): string;
549
+ export function rtrunc(a: string): string;
550
+ export function rround(a: string): string;
551
+
552
+ // 比较
553
+ export function rmax(a: string, b: string): string;
554
+ export function rmin(a: string, b: string): string;
555
+ export function rcompare(a: string, b: string): number;
556
+ export function req(a: string, b: string): boolean;
557
+ export function rlt(a: string, b: string): boolean;
558
+ export function rgt(a: string, b: string): boolean;
559
+ export function rlte(a: string, b: string): boolean;
560
+ export function rgte(a: string, b: string): boolean;