foreslash 0.3.2 → 0.3.4
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/CHANGELOG.md +26 -0
- package/lib/index.cmn.cjs +305 -4
- package/lib/index.d.ts +269 -26
- package/lib/index.mjs +298 -5
- package/lib/index.umd.js +305 -4
- package/package.json +1 -1
package/lib/index.d.ts
CHANGED
|
@@ -24,6 +24,56 @@ declare function cartesianProduct<T1, T2, T3, T4, T5, T6, T7>(arr1: ArrayLike<T1
|
|
|
24
24
|
declare function cartesianProduct<T1, T2, T3, T4, T5, T6, T7, T8>(arr1: ArrayLike<T1>, arr2: ArrayLike<T2>, arr3: ArrayLike<T3>, arr4: ArrayLike<T4>, arr5: ArrayLike<T5>, arr6: ArrayLike<T6>, arr7: ArrayLike<T7>, arr8: ArrayLike<T8>): [T1, T2, T3, T4, T5, T6, T7, T8][];
|
|
25
25
|
declare function cartesianProduct(...arrList: ArrayLike<any>[]): any[][];
|
|
26
26
|
|
|
27
|
+
/**
|
|
28
|
+
* 将值转换为一个数组
|
|
29
|
+
* @param value 需要处理的值
|
|
30
|
+
* @returns 一个数组, 如果输入值是数组, 则输出的数组是其**浅拷贝**; 如果输入不是数组,则将输入包进一个新数组里
|
|
31
|
+
* @example
|
|
32
|
+
* ```js
|
|
33
|
+
* // 如果输入不是数组,则将输入包进一个新数组里
|
|
34
|
+
* castArray(1) // [1]
|
|
35
|
+
* castArray('1') // ['1']
|
|
36
|
+
* castArray(null) // [null]
|
|
37
|
+
*
|
|
38
|
+
* // 如果输入值是数组, 则输出的数组是其浅拷贝
|
|
39
|
+
* castArray([1, 2, 3, 4, 5]) // [1, 2, 3, 4, 5]
|
|
40
|
+
* ```
|
|
41
|
+
* @version 0.3.3
|
|
42
|
+
*/
|
|
43
|
+
declare function castArray<T>(value: T): CastArray<T>;
|
|
44
|
+
/**
|
|
45
|
+
* 将任意输入处理为数组:
|
|
46
|
+
* 1. `never` 类型判断, 确保 `castArray<never>` 返回 `never[]` 而不是 `unknown[]`
|
|
47
|
+
* 2. `unknown` 类型判断, `unknown` 是顶级类型, 需要特殊处理
|
|
48
|
+
* 3. `readonly any[]` 类型判断, 输出的类型需要去除 `readonly`
|
|
49
|
+
* 4. 非数组类型判断, 处理联合类型
|
|
50
|
+
*
|
|
51
|
+
* 数组类型判据:
|
|
52
|
+
* - 如果 `Exclude<T, readonly any[]> extends never` 意味着 `T` 的类型与 `any[]` 兼容, 此时应该走逻辑 3
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* ```ts
|
|
56
|
+
* type T = CastArray<string> // string[]
|
|
57
|
+
* type T = CastArray<string[]> // string[]
|
|
58
|
+
* type T = CastArray<readonly string[]> // string[]
|
|
59
|
+
* // 特殊类型
|
|
60
|
+
* type T = CastArray<any> // any[]
|
|
61
|
+
* type T = CastArray<unknown> // unknown[]
|
|
62
|
+
* type T = CastArray<never> // never[]
|
|
63
|
+
* // 联合类型
|
|
64
|
+
* type T = CastArray<string | number> // (string | number)[]
|
|
65
|
+
* type T = CastArray<string[] | number> // string[] | number[]
|
|
66
|
+
* type T = CastArray<string | number | never> // (string | number)[]
|
|
67
|
+
* type T = CastArray<string | number[] | never[]> // never[] | number[] | string[]
|
|
68
|
+
* type T = CastArray<string | number | never[]> // never[] | (string | number)[]
|
|
69
|
+
* ```
|
|
70
|
+
*/
|
|
71
|
+
type CastArray<T> = [
|
|
72
|
+
T
|
|
73
|
+
] extends [never] ? never[] : [
|
|
74
|
+
unknown
|
|
75
|
+
] extends [T] ? unknown[] : (T extends readonly (infer U)[] ? U[] : never) | (Exclude<T, readonly any[]> extends never ? never : Exclude<T, readonly any[]>[]);
|
|
76
|
+
|
|
27
77
|
type Not<T> = T extends false | 0 | '' | null | undefined ? true : false;
|
|
28
78
|
|
|
29
79
|
type Stringify<T extends string | number | boolean | bigint | null | undefined> = `${T}`;
|
|
@@ -253,24 +303,6 @@ declare function retry<T>(asyncFunction: RetryFunction<T>, option?: RetryOption)
|
|
|
253
303
|
declare function sleep(time?: number): Promise<unknown>;
|
|
254
304
|
|
|
255
305
|
type TryitResult<Res, Err> = [undefined, Res] | [Err, undefined];
|
|
256
|
-
/**
|
|
257
|
-
* 将一个函数处理为 `error-first` 的函数
|
|
258
|
-
* @param fn 需要处理的函数, 可以是异步函数
|
|
259
|
-
* @returns 处理过的函数, 调用后返回一个 `error-first` 的元组 `[error, result]`;\
|
|
260
|
-
* 如果原函数是异步函数, 则返回值会是 `Promise<[error, result]>`;\
|
|
261
|
-
* 如果运行正常则 `result` 是原函数的返回值, `error` 为 `undefined`;\
|
|
262
|
-
* 如果出现异常则 `result` 为 `undefined`, `error` 是原函数抛出的错误
|
|
263
|
-
* @example
|
|
264
|
-
* ```js
|
|
265
|
-
* // Async Function
|
|
266
|
-
* const normalAsyncFn = () => { return Promise.resolve(1) }
|
|
267
|
-
* const errorAsyncFn = () => { return Promise.reject('1') }
|
|
268
|
-
* tryit(normalAsyncFn)() // Promise<[undefined, 1]>
|
|
269
|
-
* tryit(errorAsyncFn)() // Promise<[Error('1'), undefined]>
|
|
270
|
-
* ```
|
|
271
|
-
* @version 0.2.0
|
|
272
|
-
*/
|
|
273
|
-
declare function tryit<Args extends any[], Res, Err extends Error>(fn: (...args: Args) => Promise<Res>): (...args: Args) => Promise<TryitResult<Res, Err>>;
|
|
274
306
|
/**
|
|
275
307
|
* 将一个函数处理为 `error-first` 的函数
|
|
276
308
|
* @param fn 需要处理的函数, 可以是异步函数
|
|
@@ -285,9 +317,15 @@ declare function tryit<Args extends any[], Res, Err extends Error>(fn: (...args:
|
|
|
285
317
|
* const errorFn = () => { throw new Error('1') }
|
|
286
318
|
* tryit(normalFn)() // [undefined, 1]
|
|
287
319
|
* tryit(errorFn)() // [Error('1'), undefined]
|
|
320
|
+
* // Async Function
|
|
321
|
+
* const normalAsyncFn = () => { return Promise.resolve(1) }
|
|
322
|
+
* const errorAsyncFn = () => { return Promise.reject(new Error('1')) }
|
|
323
|
+
* tryit(normalAsyncFn)() // Promise<[undefined, 1]>
|
|
324
|
+
* tryit(errorAsyncFn)() // Promise<[Error('1'), undefined]>
|
|
288
325
|
* ```
|
|
289
326
|
* @version 0.2.0
|
|
290
327
|
*/
|
|
328
|
+
declare function tryit<Args extends any[], Res, Err extends Error>(fn: (...args: Args) => Promise<Res>): (...args: Args) => Promise<TryitResult<Res, Err>>;
|
|
291
329
|
declare function tryit<Args extends any[], Res, Err extends Error>(fn: (...args: Args) => Res): (...args: Args) => TryitResult<Res, Err>;
|
|
292
330
|
|
|
293
331
|
interface PromiseLikeConstructor {
|
|
@@ -963,14 +1001,15 @@ declare function clamp(num: number, min: number, max: number, options?: {
|
|
|
963
1001
|
declare function decimalNotation(num: string | number): string;
|
|
964
1002
|
|
|
965
1003
|
/**
|
|
966
|
-
* 将一个数字转换为指定的格式(如千分位逗号分隔)
|
|
1004
|
+
* 将一个数字转换为指定的格式(如千分位逗号分隔)\
|
|
1005
|
+
* 如果想要将数字转换为科学计数法, 请使用 `scientificNotation`
|
|
967
1006
|
* @param num 需要格式化的数字
|
|
968
1007
|
* @param options 格式化配置\
|
|
969
|
-
*
|
|
970
|
-
*
|
|
971
|
-
*
|
|
972
|
-
*
|
|
973
|
-
*
|
|
1008
|
+
* `separator` 分割符, 默认为 `','`\
|
|
1009
|
+
* `separate` 按位分割, 默认为 `3`\
|
|
1010
|
+
* `decimal` 小数点, 默认为 `'.'`\
|
|
1011
|
+
* `precision` 小数精度, 默认为 `2`\
|
|
1012
|
+
* `round` 数值修约规则
|
|
974
1013
|
* - `'round'` 四舍五入
|
|
975
1014
|
* - `'banker'` 四舍六入五成双
|
|
976
1015
|
* - `'floor'` 向下取整
|
|
@@ -1001,6 +1040,84 @@ declare function isOdd(num: number): boolean;
|
|
|
1001
1040
|
*/
|
|
1002
1041
|
declare function isEven(num: number): boolean;
|
|
1003
1042
|
|
|
1043
|
+
/**
|
|
1044
|
+
* 用线性插值法求取一个中间值
|
|
1045
|
+
* @param val1 第一个值, 当 权重=0 时返回的将是这个值, 可以是数组或二维数组
|
|
1046
|
+
* @param val2 第二个值, 当 权重=0 时返回的将是这个值, 可以是数组或二维数组
|
|
1047
|
+
* @param t 权重
|
|
1048
|
+
* @example
|
|
1049
|
+
* ```js
|
|
1050
|
+
* // 传入数值
|
|
1051
|
+
* lerp(1, 2, 0) // 1
|
|
1052
|
+
* lerp(1, 2, 0.5) // 1.5
|
|
1053
|
+
* lerp(1, 2, 1) // 2
|
|
1054
|
+
* lerp(1, 2, 3) // 4
|
|
1055
|
+
*
|
|
1056
|
+
* // 传入数组(数组长度必须一致否则会报错)
|
|
1057
|
+
* lerp([1, 2], [2, 4], 0.5) // [1.5, 3]
|
|
1058
|
+
*
|
|
1059
|
+
* // 传入二维数组(数组长度必须一致否则会报错)
|
|
1060
|
+
* lerp(
|
|
1061
|
+
* [
|
|
1062
|
+
* [1, 2],
|
|
1063
|
+
* [3, 4],
|
|
1064
|
+
* ],
|
|
1065
|
+
* [
|
|
1066
|
+
* [11, 12],
|
|
1067
|
+
* [13, 14],
|
|
1068
|
+
* ],
|
|
1069
|
+
* 0.5
|
|
1070
|
+
* )
|
|
1071
|
+
* // [
|
|
1072
|
+
* // [6, 7],
|
|
1073
|
+
* // [8, 9],
|
|
1074
|
+
* // ]
|
|
1075
|
+
* ```
|
|
1076
|
+
* @version 0.3.3
|
|
1077
|
+
*/
|
|
1078
|
+
declare function lerp(val1: number, val2: number, t: number): number;
|
|
1079
|
+
declare function lerp(val1: [number], val2: [number], t: number): [number];
|
|
1080
|
+
declare function lerp(val1: [number, number], val2: [number, number], t: number): [number, number];
|
|
1081
|
+
declare function lerp(val1: [number, number, number], val2: [number, number, number], t: number): [number, number, number];
|
|
1082
|
+
declare function lerp(val1: [number, number, number, number], val2: [number, number, number, number], t: number): [number, number, number, number];
|
|
1083
|
+
declare function lerp(val1: [number, number, number, number, number], val2: [number, number, number, number, number], t: number): [number, number, number, number, number];
|
|
1084
|
+
declare function lerp(val1: [number, number, number, number, number, number], val2: [number, number, number, number, number, number], t: number): [number, number, number, number, number, number];
|
|
1085
|
+
declare function lerp(val1: [number, number, number, number, number, number, number], val2: [number, number, number, number, number, number, number], t: number): [number, number, number, number, number, number, number];
|
|
1086
|
+
declare function lerp(val1: [number, number, number, number, number, number, number, number], val2: [number, number, number, number, number, number, number, number], t: number): [number, number, number, number, number, number, number, number];
|
|
1087
|
+
declare function lerp(val1: number[], val2: number[], t: number): number[];
|
|
1088
|
+
declare function lerp(val1: number[][], val2: number[][], t: number): number[][];
|
|
1089
|
+
|
|
1090
|
+
/**
|
|
1091
|
+
* 将一个数字转换为罗马数字, 罗马数字没有 `0`、小数和负数
|
|
1092
|
+
* @param num 需要转换的数字
|
|
1093
|
+
* @param options 格式化配置\
|
|
1094
|
+
* `type` 类型, 默认为 `unicode`, 以数字 `4090` 为例
|
|
1095
|
+
* - `'unicode'` 使用 Unicode 表示 `'I̅V̅XC'`
|
|
1096
|
+
* - `'js'` 适合用于 JavaScript 代码字符串 `'I\\u0305V\\u0305XC'`
|
|
1097
|
+
* - `'html'` 适合用于 HTML 展示的字符串 `'I̅V̅XC'`
|
|
1098
|
+
* - `'json'` 一个 JSON 字符串, 具体数值是下标^1000 `'["XC", "IV"]'`
|
|
1099
|
+
*
|
|
1100
|
+
* `thousand` 千分位类型, 默认为 `normal`
|
|
1101
|
+
* - `'normal'` 习惯用法, 超过 3999 的部分才使用上划线区分
|
|
1102
|
+
* - `'strict'` 严格区分千分位
|
|
1103
|
+
*
|
|
1104
|
+
* `zero` 用什么字符串表示 `0` (罗马数字里没有 `0`), 不填默认为 `'0'`\
|
|
1105
|
+
* `one` 用什么字符串表示 `1` (你可以设置一个彩蛋, 比如输出 `Yo`), 不填默认为 `'I'`, 这项**只会影响数字 1**
|
|
1106
|
+
* @returns 返回一个罗马数字表示的数字
|
|
1107
|
+
* @example
|
|
1108
|
+
* ```js
|
|
1109
|
+
* romanNumerals(2025) // MMXXV
|
|
1110
|
+
* romanNumerals(2025, { thousand: 'strict' }) // I̅I̅XXV
|
|
1111
|
+
* ```
|
|
1112
|
+
* @version 0.3.3
|
|
1113
|
+
*/
|
|
1114
|
+
declare function romanNumerals(num: string | number, options?: {
|
|
1115
|
+
type?: 'unicode' | 'js' | 'html' | 'json';
|
|
1116
|
+
thousand?: 'normal' | 'strict';
|
|
1117
|
+
zero?: string;
|
|
1118
|
+
one?: string;
|
|
1119
|
+
}): string;
|
|
1120
|
+
|
|
1004
1121
|
/**
|
|
1005
1122
|
* 数值修约, 可以使用 4 种修约方法, 默认使用四舍五入
|
|
1006
1123
|
* - 四舍五入: 修约位置的后一位如果是 5 则进位, 否则不进位
|
|
@@ -1106,6 +1223,51 @@ declare function roundFloor(integer: string, fractional: string, precision: numb
|
|
|
1106
1223
|
*/
|
|
1107
1224
|
declare function roundCeil(integer: string, fractional: string, precision: number, isNegative: boolean): [integer: string, fractional: string];
|
|
1108
1225
|
|
|
1226
|
+
/**
|
|
1227
|
+
* 将一个数字转换为科学计数法
|
|
1228
|
+
* @param num 需要转换的数字
|
|
1229
|
+
* @param options 格式化配置\
|
|
1230
|
+
* `type` 类型, 默认为 `unicode`
|
|
1231
|
+
* - `'unicode'` 指数部分使用 Unicode 表示 `1.23×10⁴⁵⁶`
|
|
1232
|
+
* - `'exp'` 用指数表示法, 用 `e` 替换 `×10` 部分 `1.23e+456`
|
|
1233
|
+
* - `'js'` 适合用于 JavaScript 的算式 `1.23*10**456`
|
|
1234
|
+
* - `'code'` 适合用于其他计算机语言的算式 `1.23*10^456`
|
|
1235
|
+
* - `'html'` 适合用于 HTML 展示的字符串 `1.23×10<sup>456</sup>`
|
|
1236
|
+
* - `'json'` 一个 JSON 字符串, 可以自由处理 `{"number":1.23,"exp":456}`
|
|
1237
|
+
*
|
|
1238
|
+
* `precision` 小数精度, 默认不作数值修约\
|
|
1239
|
+
* `round` 数值修约规则
|
|
1240
|
+
* - `'round'` 四舍五入
|
|
1241
|
+
* - `'banker'` 四舍六入五成双
|
|
1242
|
+
* - `'floor'` 向下取整
|
|
1243
|
+
* - `'ceil'` 向上取整
|
|
1244
|
+
* @returns 返回一个科学计数法表示的数字
|
|
1245
|
+
* @example
|
|
1246
|
+
* ```js
|
|
1247
|
+
* scientificNotation(1e12) // 1×10¹²
|
|
1248
|
+
* scientificNotation(-2.33e-8) // -2.33×10⁻⁸
|
|
1249
|
+
* // 可以指定输出类型
|
|
1250
|
+
* scientificNotation(1.234e-6, { type: 'exp' }) // 1.234e-6
|
|
1251
|
+
* scientificNotation(1.234e6, { type: 'exp' }) // 1.234e+6
|
|
1252
|
+
* scientificNotation(6.534e-6, { type: 'code' }) // 6.534*10^-6
|
|
1253
|
+
* scientificNotation(6.534e6, { type: 'code' }) // 6.534*10^6
|
|
1254
|
+
* scientificNotation(-4.321e-8, { type: 'html' }) // -4.321×10<sup>-8</sup>
|
|
1255
|
+
* scientificNotation(-4.321e8, { type: 'html' }) // -4.321×10<sup>8</sup>
|
|
1256
|
+
* scientificNotation(-9.87e-9, { type: 'json' }) // {"number":"-9.87","exp":-9}
|
|
1257
|
+
* scientificNotation(-9.87e9, { type: 'json' }) // {"number":"-9.87","exp":9}
|
|
1258
|
+
* // 可以指定小数点后的位数及数值修约规则
|
|
1259
|
+
* scientificNotation(1.235e6, { type: 'exp', precision: 2 }) // 1.24e+6
|
|
1260
|
+
* scientificNotation(6.545e-6, { type: 'code', precision: 2, round: 'banker' }) // 6.54*10^-6
|
|
1261
|
+
* scientificNotation(-9.87e9, { type: 'json', precision: 1, round: 'floor' }) // {"number":"-9.9","exp":9}
|
|
1262
|
+
* ```
|
|
1263
|
+
* @version 0.3.3
|
|
1264
|
+
*/
|
|
1265
|
+
declare function scientificNotation(num: string | number, options?: {
|
|
1266
|
+
type?: 'unicode' | 'exp' | 'js' | 'code' | 'html' | 'json';
|
|
1267
|
+
precision?: number;
|
|
1268
|
+
round?: 'round' | 'banker' | 'floor' | 'ceil';
|
|
1269
|
+
}): string;
|
|
1270
|
+
|
|
1109
1271
|
/**
|
|
1110
1272
|
* 根据文件名称判断是否匹配支持的文件类型,需要注意 `.C` 与 `.c` 的区别
|
|
1111
1273
|
* - `text/x-c++src` 对应 `.C`
|
|
@@ -1200,6 +1362,35 @@ declare function getAcceptableMIMEByExt(ext: string): string[];
|
|
|
1200
1362
|
*/
|
|
1201
1363
|
declare function randomChoice<T>(arr: ArrayLike<T>, weights?: ArrayLike<number>): T;
|
|
1202
1364
|
|
|
1365
|
+
/**
|
|
1366
|
+
* 一个广泛使用的[伪随机数生成算法(PRD)](https://github.com/Moushudyx/pseudo-random-distribution)\
|
|
1367
|
+
* 返回一个方法, 输出为布尔型, 可以生成一个比正常随机序列分布更加均匀的伪随机数列\
|
|
1368
|
+
* 可以极大地避免罕见牌型出现, 缺点是初始概率很低(即第一次命中的概率远远小于输入的 `p`)\
|
|
1369
|
+
* 建议在投入使用之前, 先调用 `ceil(1 / p)` 次作为初始化\
|
|
1370
|
+
* 此外需要注意的是, 这个算法的最终的精度并不是完全等于输入的 `p` 值
|
|
1371
|
+
* @param p 整体概率值, 即概率的数学期望
|
|
1372
|
+
* @param options 相关配置
|
|
1373
|
+
* - `threshold` 精度, 数值越小, 精度越高, 序列越接近目标 `p` 值, 默认为 `5e-6`
|
|
1374
|
+
* @returns 一个方法, 按给定的概率值返回 `true` 和 `false`
|
|
1375
|
+
* @example
|
|
1376
|
+
* ```js
|
|
1377
|
+
* const p0_5 = pipe(randomDistribution(0.5), Number)
|
|
1378
|
+
* p0_5() // 0, 1, 0, 0, 1, 1 ...
|
|
1379
|
+
* ```
|
|
1380
|
+
* @version 0.3.3
|
|
1381
|
+
*/
|
|
1382
|
+
declare function randomDistribution(p: number, options?: {
|
|
1383
|
+
threshold: number;
|
|
1384
|
+
}): () => boolean;
|
|
1385
|
+
/**
|
|
1386
|
+
* 内部方法, 用于实现 `randomDistribution` 中的 PRD 算法部分, 根据目标概率, 给出一个初始概率
|
|
1387
|
+
* @param targetP 目标概率
|
|
1388
|
+
* @param threshold 精度, 数值越小, 精度越高
|
|
1389
|
+
* @returns PRD 算法需要的初始概率
|
|
1390
|
+
* @version 0.3.3
|
|
1391
|
+
*/
|
|
1392
|
+
declare function getInitP(targetP: number, threshold?: number): number;
|
|
1393
|
+
|
|
1203
1394
|
/**
|
|
1204
1395
|
* 生成指定范围内的随机整数
|
|
1205
1396
|
* @param min 随机数的下界,包含于此范围内
|
|
@@ -2029,6 +2220,7 @@ declare function isEmpty(value: unknown): boolean;
|
|
|
2029
2220
|
* return fib(n - 1) + fib(n - 2)
|
|
2030
2221
|
* })
|
|
2031
2222
|
* ```
|
|
2223
|
+
* @version 0.2.1
|
|
2032
2224
|
*/
|
|
2033
2225
|
declare function memo<TArgs extends any[], TRes>(fn: (...args: TArgs) => TRes, options?: {
|
|
2034
2226
|
getKey?: (...args: TArgs) => string | number;
|
|
@@ -2053,6 +2245,34 @@ declare const noop: (...args: any[]) => void;
|
|
|
2053
2245
|
*/
|
|
2054
2246
|
declare function not(value: unknown): boolean;
|
|
2055
2247
|
|
|
2248
|
+
type KeyOf<T extends object> = object extends T ? keyof any : keyof T;
|
|
2249
|
+
type ValueOf<T extends object> = object extends T ? unknown : T[keyof T];
|
|
2250
|
+
type PickPredicate<T extends object> = (value: ValueOf<T>, key: KeyOf<T>, obj: T) => any;
|
|
2251
|
+
type OmitPredicate<T extends object> = (value: ValueOf<T>, key: KeyOf<T>, obj: T) => any;
|
|
2252
|
+
|
|
2253
|
+
/**
|
|
2254
|
+
* 给定一个对象和对象中键的列表, 返回一个**排除**给定键的新对象(是传入对象的浅拷贝)\
|
|
2255
|
+
* 如果你希望深拷贝一个对象, 请使用 `deepClone` 或 `fastClone`
|
|
2256
|
+
* @param obj 需要处理的对象
|
|
2257
|
+
* @param keys 需要**排除**的键, 可以是一个数组、字符串或谓词函数
|
|
2258
|
+
* @returns 传入对象的浅拷贝, 与传入对象不同的是新对象**排除了**指定的键
|
|
2259
|
+
* @example
|
|
2260
|
+
* ```ts
|
|
2261
|
+
* omit({ a: 1, b: 2, c: '' }, ['a', 'c']) // { b: 2 }
|
|
2262
|
+
* omit({ a: 1, b: 2, c: '' }, 'b') // { a: 1, c: '' }
|
|
2263
|
+
* // 谓词函数
|
|
2264
|
+
* omit({ a: 1, b: 2, c: '' }, (value, key) => value === 2 || key === 'c') // { a: 1 }
|
|
2265
|
+
* // 需要注意的是传入谓词函数时可能会有类型不匹配的问题
|
|
2266
|
+
* // Typescript 无法得知最终过滤的结果, 而是认为过滤结果与原类型一致
|
|
2267
|
+
* const obj = omit({ a: 1, b: 2 }, (value, key) => value === 2) // { a: 1 }
|
|
2268
|
+
* type typeofObj = typeof obj // { a: number; b: number } <- Typescript 没有推导出正确结果
|
|
2269
|
+
* ```
|
|
2270
|
+
* @version 0.3.4
|
|
2271
|
+
*/
|
|
2272
|
+
declare function omit<T extends object, K extends keyof T>(obj: T, keys: K[]): Omit<T, K>;
|
|
2273
|
+
declare function omit<T extends object, K extends keyof T>(obj: T, keys: OmitPredicate<T>): T;
|
|
2274
|
+
declare function omit<T extends object, K extends keyof T>(obj: T, key: K): Omit<T, K>;
|
|
2275
|
+
|
|
2056
2276
|
/**
|
|
2057
2277
|
* 不做任何操作,返回第一个参数,一般用于函数式编程
|
|
2058
2278
|
* @param value 任意值
|
|
@@ -2081,6 +2301,29 @@ declare function pass(): undefined;
|
|
|
2081
2301
|
*/
|
|
2082
2302
|
declare function passWith<T>(fn: (arg: T) => any): typeof pass;
|
|
2083
2303
|
|
|
2304
|
+
/**
|
|
2305
|
+
* 给定一个对象和对象中键的列表, 返回一个**只包含**给定键的新对象(是传入对象的浅拷贝)\
|
|
2306
|
+
* 如果你希望深拷贝一个对象, 请使用 `deepClone` 或 `fastClone`
|
|
2307
|
+
* @param obj 需要处理的对象
|
|
2308
|
+
* @param keys 需要**取出**的键, 可以是一个数组、字符串或谓词函数
|
|
2309
|
+
* @returns 传入对象的浅拷贝, 与传入对象不同的是新对象仅包含指定的键
|
|
2310
|
+
* @example
|
|
2311
|
+
* ```ts
|
|
2312
|
+
* pick({ a: 1, b: 2, c: '' }, ['a', 'c']) // { a: 1, c: '' }
|
|
2313
|
+
* pick({ a: 1, b: 2, c: '' }, 'b') // { b: 2 }
|
|
2314
|
+
* // 谓词函数
|
|
2315
|
+
* pick({ a: 1, b: 2, c: '' }, (value, key) => value === 2 || key === 'c') // { b: 2, c: '' }
|
|
2316
|
+
* // 需要注意的是传入谓词函数时可能会有类型不匹配的问题
|
|
2317
|
+
* // Typescript 无法得知最终过滤的结果, 而是认为过滤结果与原类型一致
|
|
2318
|
+
* const obj = pick({ a: 1, b: 2 }, (value, key) => value === 2) // { b: 2 }
|
|
2319
|
+
* type typeofObj = typeof obj // { a: number; b: number } <- Typescript 没有推导出正确结果
|
|
2320
|
+
* ```
|
|
2321
|
+
* @version 0.3.4
|
|
2322
|
+
*/
|
|
2323
|
+
declare function pick<T extends object, K extends keyof T>(obj: T, keys: K[]): Pick<T, K>;
|
|
2324
|
+
declare function pick<T extends object, K extends keyof T>(obj: T, keys: PickPredicate<T>): T;
|
|
2325
|
+
declare function pick<T extends object, K extends keyof T>(obj: T, key: K): Pick<T, K>;
|
|
2326
|
+
|
|
2084
2327
|
// pipe
|
|
2085
2328
|
type PipeFuncList1<PipeArgs extends any[], PipeResult> = [(...args: PipeArgs) => PipeResult]
|
|
2086
2329
|
type PipeFuncList2<PipeArgs extends any[], PipeResult, Mid1 = any> = [
|
|
@@ -2216,5 +2459,5 @@ declare function throttle<T extends any[]>(fn: (...args: T) => any, delay: numbe
|
|
|
2216
2459
|
reset: () => void;
|
|
2217
2460
|
};
|
|
2218
2461
|
|
|
2219
|
-
export { $$Empty, _, acceptableFileName, acceptableFileType, camelCase, capitalize, cartesianProduct, caseCamel, caseConvert, caseKebab, casePascal, caseSnake, chunk, clamp, compose, _curryMore as curry, debounce, decimalNotation, dedent, deepClone, deepMerge, defer, fastClone, format, getAcceptableExtByMIME, getAcceptableMIMEByExt, getGlobalThis, getTag, indent, isArray, isArrayBuffer, isArrayLike, isBigInt, isBigInt64Array, isBigUint64Array, isBlob, isBoolean, isBuffer, isDataView, isDate, isEmpty, isEven, isFile, isFloat32Array, isFloat64Array, isFormData, isFunction, isInt16Array, isInt32Array, isInt8Array, isInteger, isIterable, isMap, isMergeEmptyPlaceholder, isNil, isNull, isNumber, isObject, isOdd, isPlaceholder, isPlainObject, isPrimitive, isPromise, isPromiseLike, isRegExp, isSet, isString, isSymbol, isTypedArray, isUint16Array, isUint32Array, isUint8Array, isUint8ClampedArray, isUndefined, isWeakMap, isWeakSet, isWrapperBigInt, isWrapperBoolean, isWrapperNumber, isWrapperObject, isWrapperString, isWrapperSymbol, kebabCase, memo, noop, not, parallel, pascalCase, pass, passWith, pipe, randomBase32String, randomChoice, randomHexString, randomInt, randomIntFloor, randomString, range, remove, retry, round, roundBank, roundBase, roundCeil, roundFloor, shuffle, sleep, snakeCase, splitWords, throttle, titleCase, tryit, ulid, uncapitalize, uuidNil, uuidV4, withResolvers };
|
|
2220
|
-
export type { BaseMargeType, Chunked, CloneOptions, CustomCloner, IsNegative, IsPositive, IsZero, MergeOption, MergeStrategy, MergeStrategyFunction, MergeType, MergeTypeStrategy, Not, RangeOptions, SourceMergeType, Stringify, TargetMergeType, TypedArray };
|
|
2462
|
+
export { $$Empty, _, acceptableFileName, acceptableFileType, camelCase, capitalize, cartesianProduct, caseCamel, caseConvert, caseKebab, casePascal, caseSnake, castArray, chunk, clamp, compose, _curryMore as curry, debounce, decimalNotation, dedent, deepClone, deepMerge, defer, fastClone, format, getAcceptableExtByMIME, getAcceptableMIMEByExt, getGlobalThis, getInitP, getTag, indent, isArray, isArrayBuffer, isArrayLike, isBigInt, isBigInt64Array, isBigUint64Array, isBlob, isBoolean, isBuffer, isDataView, isDate, isEmpty, isEven, isFile, isFloat32Array, isFloat64Array, isFormData, isFunction, isInt16Array, isInt32Array, isInt8Array, isInteger, isIterable, isMap, isMergeEmptyPlaceholder, isNil, isNull, isNumber, isObject, isOdd, isPlaceholder, isPlainObject, isPrimitive, isPromise, isPromiseLike, isRegExp, isSet, isString, isSymbol, isTypedArray, isUint16Array, isUint32Array, isUint8Array, isUint8ClampedArray, isUndefined, isWeakMap, isWeakSet, isWrapperBigInt, isWrapperBoolean, isWrapperNumber, isWrapperObject, isWrapperString, isWrapperSymbol, kebabCase, lerp, memo, noop, not, omit, parallel, pascalCase, pass, passWith, pick, pipe, randomBase32String, randomChoice, randomDistribution, randomHexString, randomInt, randomIntFloor, randomString, range, remove, retry, romanNumerals, round, roundBank, roundBase, roundCeil, roundFloor, scientificNotation, shuffle, sleep, snakeCase, splitWords, throttle, titleCase, tryit, ulid, uncapitalize, uuidNil, uuidV4, withResolvers };
|
|
2463
|
+
export type { BaseMargeType, CastArray, Chunked, CloneOptions, CustomCloner, IsNegative, IsPositive, IsZero, MergeOption, MergeStrategy, MergeStrategyFunction, MergeType, MergeTypeStrategy, Not, RangeOptions, SourceMergeType, Stringify, TargetMergeType, TypedArray };
|