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/README.md +317 -66
- package/dist/create-enum.cjs.js +1 -241
- package/dist/create-enum.es.js +1 -239
- package/dist/create-enum.umd.js +1 -247
- package/dist/index.d.ts +158 -101
- package/package.json +7 -4
package/dist/index.d.ts
CHANGED
|
@@ -1,127 +1,184 @@
|
|
|
1
|
-
|
|
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
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
*
|
|
37
|
-
|
|
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
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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
|
-
*
|
|
72
|
+
* 获取所有枚举 Key 列表
|
|
48
73
|
*/
|
|
49
|
-
|
|
74
|
+
keys(): TEUnion<T>[];
|
|
50
75
|
/**
|
|
51
76
|
* 获取枚举值
|
|
52
|
-
* @param
|
|
53
|
-
* @return {Number} 枚举值
|
|
77
|
+
* @param key 枚举 Key
|
|
54
78
|
*/
|
|
55
|
-
|
|
79
|
+
value<K extends TEUnion<T>>(key: K): TValue<K, T>;
|
|
56
80
|
/**
|
|
57
|
-
*
|
|
58
|
-
* @param
|
|
59
|
-
* @return {Array} {[枚举值]}
|
|
81
|
+
* 获取多个枚举值,不传参则返回所有
|
|
82
|
+
* @param args 枚举 Key 列表
|
|
60
83
|
*/
|
|
61
|
-
|
|
84
|
+
values<K extends TEUnion<T>>(...args: K[]): TValue<K, T>[];
|
|
62
85
|
/**
|
|
63
|
-
*
|
|
64
|
-
* @param
|
|
65
|
-
* @return {Object} {[枚举key]:枚举值}
|
|
86
|
+
* 获取枚举选项列表(适配 Select/Radio 等组件),不传参则返回所有
|
|
87
|
+
* @param args 枚举 Key 列表
|
|
66
88
|
*/
|
|
67
|
-
|
|
89
|
+
options<K extends TEUnion<T>>(...args: K[]): TOption<K, T>[];
|
|
68
90
|
/**
|
|
69
|
-
*
|
|
70
|
-
* @param
|
|
71
|
-
* @param {String} arguType 枚举KEY的类型,key|value
|
|
72
|
-
* @return {String} 枚举名称
|
|
91
|
+
* 获取枚举名称(通过 Key 或 Value)
|
|
92
|
+
* @param keyOrVal 枚举 Key 或 Value
|
|
73
93
|
*/
|
|
74
|
-
|
|
75
|
-
|
|
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
|
|
83
|
-
* @return {String|Null}
|
|
97
|
+
* 获取枚举附加数据(通过 Key 或 Value)
|
|
98
|
+
* @param keyOrVal 枚举 Key 或 Value
|
|
84
99
|
*/
|
|
85
|
-
|
|
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
|
-
*
|
|
88
|
-
* @param
|
|
89
|
-
* @returns {Array} 选项名称、选项值的列表
|
|
103
|
+
* 通过 Value 反查 Key
|
|
104
|
+
* @param val 枚举 Value
|
|
90
105
|
*/
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
*
|
|
105
|
-
*/
|
|
106
|
-
|
|
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
|
|
114
|
-
* @param {String} typeKey 类型key
|
|
115
|
-
* @return {Boolean}
|
|
123
|
+
* 排除指定 Key,生成新的枚举实例
|
|
124
|
+
* @param args 要排除的 Key 列表
|
|
116
125
|
*/
|
|
117
|
-
|
|
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 {
|
|
122
|
-
*
|
|
123
|
-
* @
|
|
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
|
|
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": "
|
|
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": "
|
|
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.
|
|
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
|
}
|