create-enum-es 1.0.3 → 3.0.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.
package/dist/index.d.ts CHANGED
@@ -1,127 +1,184 @@
1
- type IEMap = Readonly<Record<any, readonly [any, any]>>;
1
+ /**
2
+ * 宽化字面量类型
3
+ */
4
+ type WidenLiteral<T> = T extends string ? string : T extends number ? number : T extends boolean ? boolean : T;
5
+ /**
6
+ * 枚举 Map 约束类型:{ KEY: [value, label, extra?] }
7
+ */
8
+ type IEMap = Readonly<Record<string, readonly [any, any, any?]>>;
9
+ /**
10
+ * 枚举 Key 联合类型
11
+ */
2
12
  type TEUnion<T extends IEMap> = keyof T;
3
- type TEValue<T extends IEMap> = T[TEUnion<T>][0];
4
- type IVMap<U extends string | number | symbol, T extends IEMap> = {
5
- [K in U]: T[K] extends readonly [infer V, infer F] ? V : any;
13
+ /**
14
+ * 枚举 Value 联合类型
15
+ */
16
+ type TEValue<T extends IEMap> = T[keyof T][0];
17
+ /**
18
+ * 根据 Key 获取 Value 类型
19
+ */
20
+ type TValue<K, T extends IEMap> = WidenLiteral<T[K & keyof T][0]>;
21
+ /**
22
+ * 根据 Key 获取 Label 类型
23
+ */
24
+ type TULabel<K, T extends IEMap> = WidenLiteral<T[K & keyof T][1]>;
25
+ /**
26
+ * 根据 Value 获取 Label 类型
27
+ */
28
+ type TVLabel<V, T extends IEMap> = WidenLiteral<Extract<T[keyof T], readonly [V, any, any?]>[1]>;
29
+ /**
30
+ * 根据 Key 获取 Extra 类型
31
+ */
32
+ type TUExtra<K, T extends IEMap> = WidenLiteral<T[K & keyof T][2]>;
33
+ /**
34
+ * 根据 Value 获取 Extra 类型
35
+ */
36
+ type TVExtra<V, T extends IEMap> = WidenLiteral<Extract<T[keyof T], readonly [V, any, any?]>[2]>;
37
+ /**
38
+ * 根据 Value 反查 Key 类型
39
+ */
40
+ type TKeyOfValue<V, T extends IEMap> = {
41
+ [K in keyof T]: T[K][0] extends V ? K : never;
42
+ }[keyof T];
43
+ /**
44
+ * Option 项类型
45
+ */
46
+ type TOption<K extends keyof T, T extends IEMap> = {
47
+ value: TValue<K, T>;
48
+ label: TULabel<K, T>;
49
+ extra: TUExtra<K, T>;
6
50
  };
7
- type IEnum<T extends IEMap, Enum> = {
8
- readonly [K in keyof T]: T[K] extends readonly [infer V, infer F] ? V : any;
9
- } & Enum;
10
- interface IArguConf {
11
- arguType?: "key" | "value";
12
- }
13
- interface IFeildConf {
14
- labelKey?: string;
15
- valueKey?: string;
16
- }
17
- type IConf = IArguConf & IFeildConf;
18
- type IArgLastConfig<U, T extends IEMap> = U extends [...infer Rest, infer Last] ? Last extends IConf ? (Last["labelKey"] extends string ? {
19
- [K in Last["labelKey"]]: TEValue<T>;
20
- } : {
21
- label: string;
22
- }) & (Last["valueKey"] extends string ? {
23
- [K in Last["valueKey"]]: any;
24
- } : {
25
- value: TEValue<T>;
26
- }) : {
27
- label: string;
28
- value: TEValue<T>;
29
- } : never;
30
-
31
51
  /**
32
- * 枚举类
33
- * @param {Object} enumMap 枚举对象
34
- * 枚举格式:
35
- * {
36
- * 枚举key1: [枚举值1,枚举描述1],
37
- * 枚举key2: [枚举值2,枚举描述2]
38
- * }
52
+ * 排除指定 Key 后的枚举类型
53
+ */
54
+ type TOmitEnum<T extends IEMap, K extends keyof T> = Omit<T, K> extends infer R ? R extends IEMap ? R : never : never;
55
+ /**
56
+ * 选取指定 Key 的枚举类型
57
+ */
58
+ type TPickEnum<T extends IEMap, K extends keyof T> = Pick<T, K> extends infer R ? R extends IEMap ? R : never : never;
59
+ /**
60
+ * 最终暴露的枚举实例类型
39
61
  */
62
+ type IEnum<T extends IEMap> = {
63
+ readonly [K in keyof T]: T[K][0];
64
+ } & Enum<T>;
40
65
  declare class Enum<T extends IEMap> {
41
- #private;
42
- private __enumMap__;
43
- private __enumValueMap__;
44
- private __enumNameMap__;
45
- private __valueNameMap__;
66
+ protected readonly __enumMap__: T;
67
+ protected readonly __enumLabelMap__: Record<string | number, unknown>;
68
+ protected readonly __enumExtraMap__: Record<string | number, unknown>;
69
+ protected readonly __valueKeyMap__: Record<string | number, string>;
70
+ constructor(enumMap: T);
46
71
  /**
47
- * @param {Object} enumMap 枚举map
72
+ * 获取所有枚举 Key 列表
48
73
  */
49
- constructor(enumMap: T);
74
+ keys(): TEUnion<T>[];
50
75
  /**
51
76
  * 获取枚举值
52
- * @param {String} key 枚举KEY
53
- * @return {Number} 枚举值
77
+ * @param key 枚举 Key
54
78
  */
55
- getVal(key: TEUnion<T>): TEValue<T>;
79
+ value<K extends TEUnion<T>>(key: K): TValue<K, T>;
56
80
  /**
57
- * 获取多个枚举值
58
- * @param {Array} param 多个枚举KEY
59
- * @return {Array} {[枚举值]}
81
+ * 获取多个枚举值,不传参则返回所有
82
+ * @param args 枚举 Key 列表
60
83
  */
61
- getValList(...args: TEUnion<T>[]): TEValue<T>[];
84
+ values<K extends TEUnion<T>>(...args: K[]): TValue<K, T>[];
62
85
  /**
63
- * 获取多个枚举值Map
64
- * @param {Array} param 多个枚举KEY,如果不传递则返回所有
65
- * @return {Object} {[枚举key]:枚举值}
86
+ * 获取枚举选项列表(适配 Select/Radio 等组件),不传参则返回所有
87
+ * @param args 枚举 Key 列表
66
88
  */
67
- getValMap<V extends TEUnion<T>>(...args: V[]): IVMap<V, T>;
89
+ options<K extends TEUnion<T>>(...args: K[]): TOption<K, T>[];
68
90
  /**
69
- * 获取枚举名称
70
- * @param {String} keyOrVal 枚举KEY或枚举值
71
- * @param {String} arguType 枚举KEY的类型,key|value
72
- * @return {String} 枚举名称
91
+ * 获取枚举名称(通过 Key 或 Value)
92
+ * @param keyOrVal 枚举 Key 或 Value
73
93
  */
74
- getName<U extends {
75
- arguType?: "key";
76
- }>(keyOrVal: TEUnion<T>, _config?: U): string;
77
- getName<U extends {
78
- arguType: "value";
79
- }>(keyOrVal: TEValue<T>, _config?: U): string;
94
+ label<K extends TEUnion<T>>(key: K): TULabel<K, T>;
95
+ label<V extends TEValue<T>>(val: V): TVLabel<V, T>;
80
96
  /**
81
- * 通过枚举值获取枚举名称
82
- * @param {String|Nunber} val
83
- * @return {String|Null}
97
+ * 获取枚举附加数据(通过 Key 或 Value)
98
+ * @param keyOrVal 枚举 Key 或 Value
84
99
  */
85
- getNameByValue(val: TEValue<T>): string;
100
+ extra<K extends TEUnion<T>>(key: K): TUExtra<K, T>;
101
+ extra<V extends TEValue<T>>(val: V): TVExtra<V, T>;
86
102
  /**
87
- * 通过枚举KEY或枚举值获取列表选项
88
- * @param {Array} param 多个枚举KEY或枚举值,如果不传递则返回所有。最后一位可以为选项的配置项
89
- * @returns {Array} 选项名称、选项值的列表
103
+ * 通过 Value 反查 Key
104
+ * @param val 枚举 Value
90
105
  */
91
- getOptions<U extends TEUnion<T>[]>(..._args: U): {
92
- label: string;
93
- value: TEValue<T>;
94
- }[];
95
- getOptions<U extends [...TEUnion<T>[], {
96
- arguType?: "key";
97
- } & IFeildConf]>(..._args: U): IArgLastConfig<U, T>[];
98
- getOptions<U extends [...TEValue<T>[], {
99
- arguType: "value";
100
- } & IFeildConf]>(..._args: U): IArgLastConfig<U, T>[];
101
- /**
102
- * 通过枚举值获取列表选项
103
- * @param {Array} param args 多个枚举值,如果不传递则返回所有。最后一位可以为选项的配置项
104
- * @returns {Array} 选项名称、选项值的列表
105
- */
106
- getOptionsByValues<U extends [...TEValue<T>[], IFeildConf]>(..._args: U): IArgLastConfig<U, T>[];
107
- getOptionsByValues<U extends [...TEValue<T>[]]>(..._args: U): {
108
- label: string;
109
- value: TEValue<T>;
110
- }[];
106
+ keyOf<V extends TEValue<T>>(val: V): TKeyOfValue<V, T>;
107
+ /**
108
+ * 检测值是否等于指定枚举 Key 对应的值
109
+ * @param val 待检测的值
110
+ * @param key 枚举 Key
111
+ */
112
+ check<K extends TEUnion<T>>(val: unknown, key: K): boolean;
113
+ /**
114
+ * 检测值是否属于该枚举的任意一个值
115
+ * @param val 待检测的值
116
+ */
117
+ has(val: unknown): val is TEValue<T>;
118
+ /**
119
+ * 获取枚举项数量
120
+ */
121
+ get size(): number;
111
122
  /**
112
- * 检测字段类型
113
- * @param {Number} typeVal 类型
114
- * @param {String} typeKey 类型key
115
- * @return {Boolean}
123
+ * 排除指定 Key,生成新的枚举实例
124
+ * @param args 要排除的 Key 列表
116
125
  */
117
- check(typeVal: any, typeKey: TEUnion<T>): boolean;
126
+ omit<K extends TEUnion<T>>(...args: K[]): Readonly<IEnum<TOmitEnum<T, K>>>;
127
+ /**
128
+ * 选取指定 Key,生成新的枚举实例
129
+ * @param args 要保留的 Key 列表
130
+ */
131
+ pick<K extends TEUnion<T>>(...args: K[]): Readonly<IEnum<TPickEnum<T, K & string>>>;
132
+ /**
133
+ * 遍历枚举项
134
+ * @param callback 回调函数 (value, label, key, extra) => void
135
+ */
136
+ forEach(callback: (value: TEValue<T>, label: unknown, key: TEUnion<T>, extra: unknown) => void): void;
137
+ /**
138
+ * 将枚举转为 Map 对象 { value => label }
139
+ */
140
+ toMap(): Map<TEValue<T>, unknown>;
141
+ /**
142
+ * 将枚举转为 Record 对象 { [value]: label }
143
+ */
144
+ toRecord(): Record<string | number, unknown>;
145
+ /**
146
+ * 过滤枚举项,返回满足条件的 options
147
+ * @param predicate 过滤函数
148
+ */
149
+ filter(predicate: (value: TEValue<T>, label: unknown, key: TEUnion<T>, extra: unknown) => boolean): TOption<TEUnion<T>, T>[];
150
+ /**
151
+ * 支持 for...of 迭代
152
+ */
153
+ [Symbol.iterator](): Iterator<{
154
+ key: TEUnion<T>;
155
+ value: TEValue<T>;
156
+ label: unknown;
157
+ extra: unknown;
158
+ }>;
118
159
  }
119
160
  /**
120
- * 创建枚举
121
- * @param {Object} enumMap
122
- * @param {String} description
123
- * @returns
161
+ * 创建枚举实例
162
+ * @param enumMap 枚举定义对象,格式:{ KEY: [value, label, extra?] as const }
163
+ *
164
+ * @example
165
+ * const Status = createEnum({
166
+ * ACTIVE: [1, '激活', { color: 'green' }],
167
+ * INACTIVE: [0, '未激活', { color: 'gray' }],
168
+ * } as const);
169
+ *
170
+ * Status.ACTIVE // 1
171
+ * Status.value('ACTIVE') // 1
172
+ * Status.label('ACTIVE') // '激活'
173
+ * Status.label(1) // '激活'
174
+ * Status.extra('ACTIVE') // { color: 'green' }
175
+ * Status.keyOf(1) // 'ACTIVE'
176
+ * Status.has(1) // true
177
+ * Status.has(99) // false
178
+ * Status.options() // [{ value: 1, label: '激活', extra: {...} }, ...]
179
+ * Status.pick('ACTIVE') // 新枚举,仅包含 ACTIVE
180
+ * Status.omit('INACTIVE')// 新枚举,排除 INACTIVE
124
181
  */
125
- declare const createEnum: <T extends IEMap>(enumMap: T) => IEnum<T, Enum<T>>;
182
+ declare const createEnum: <T extends IEMap>(enumMap: T) => Readonly<IEnum<T>>;
126
183
 
127
- export { createEnum };
184
+ export { createEnum as default };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-enum-es",
3
- "version": "1.0.3",
3
+ "version": "3.0.0",
4
4
  "description": "处理前端枚举的工具方法,支持ts类型检测",
5
5
  "main": "dist/create-enum.es.js",
6
6
  "types": "dist/index.d.ts",
@@ -24,16 +24,19 @@
24
24
  ],
25
25
  "type": "module",
26
26
  "scripts": {
27
- "test": "echo \"Error: no test specified\" && exit 1",
27
+ "test": "vitest --run",
28
28
  "build": "rollup -c",
29
29
  "dev": "rollup -cw"
30
30
  },
31
31
  "author": "Xiou.Wang",
32
32
  "license": "ISC",
33
33
  "devDependencies": {
34
+ "@rollup/plugin-node-resolve": "^16.0.1",
35
+ "@rollup/plugin-terser": "^0.4.4",
34
36
  "@rollup/plugin-typescript": "^11.1.6",
35
- "rollup": "^4.18.1",
37
+ "rollup": "^4.45.1",
36
38
  "rollup-plugin-dts": "^6.1.1",
37
- "typescript": "^5.5.3"
39
+ "typescript": "^5.5.3",
40
+ "vitest": "^4.1.9"
38
41
  }
39
42
  }