diff --git a/src/config/defineConstants.ts b/src/config/defineConstants.ts index a864b07..0ff44fa 100644 --- a/src/config/defineConstants.ts +++ b/src/config/defineConstants.ts @@ -1,17 +1,3 @@ -type ArrayMap< - A extends readonly Item[], - K extends keyof A[number], - B extends string[] = [] -> = A["length"] extends B["length"] ? B : ArrayMap; - -type ArrayFind = A extends readonly [ - infer I extends Item, - ...infer R extends Item[] -] - ? I["value"] extends V - ? I["label"] - : ArrayFind - : "nev1er"; type MergeIntersection = A extends infer T ? { [Key in keyof T]: T[Key] } : never; @@ -27,22 +13,22 @@ type ConstantType = MergeIntersection< /** * 枚举值 */ - [K in T[number] as K["enumKey"]]: K["value"]; + [K in T[number]as K["enumKey"]]: K["value"]; } & { /** - * 原始字典项 + * 格式化 + * @param value value值 + * @param key 指定返回的属性,默认为label */ - items: T; - /** - * 字典项映射 - */ - map: { - [k in T[number] as k["value"]]: k; - }; + format(value: K, key?: keyof T[number]): any; /** * 所有值组成的数组 */ - values: ArrayMap; + values: any[]; + /** + * 返回数组,由指定属性的值组成 + */ + prop(key: K): T[number][K][]; /** * 获取指定值的项 */ @@ -52,15 +38,15 @@ type ConstantType = MergeIntersection< */ omit(...values: T[number]["value"][]): Item[]; /** - * 返回数组,由指定属性的值组成 + * 原始项数组 */ - each(key: K): T[number][K][]; + raw: T; /** - * 格式化 - * @param value value值 - * @param key 指定返回的属性,默认为label + * 字典项映射 */ - format(value: K, key?: keyof T[number]): ArrayFind; + map: { + [k in T[number]as k["value"]]: k; + }; } >; @@ -68,19 +54,18 @@ type ConstantType = MergeIntersection< * 提供公共方法 */ class Constanter { - // @ts-ignore - items: Item[]; + raw: Item[] = []; pick(...values: any[]) { - return this.items.filter((item) => values.includes(item.value)); + return this.raw.filter((item) => values.includes(item.value)); } omit(...values: any[]) { - return this.items.filter((item) => !values.includes(item.value)); + return this.raw.filter((item) => !values.includes(item.value)); } each(key: string) { - return this.items.map((item) => item[key]); + return this.raw.map((item) => item[key]); } format(value: any, key: string = "label") { - return this.items.find((item) => item.value === value)?.[key]; + return this.raw.find((item) => item.value === value)?.[key]; } } @@ -122,6 +107,6 @@ export function defineConstants(items: T): ConstantTy // console.log("media", media, media.VIDEO, media.IMAGE, media.TEXT); // console.log("media pick", media.pick(media.VIDEO)); // console.log("media omit", media.omit(media.TEXT)); -// console.log("media each", media.each("label")); +// console.log("media each", media.prop("label")); // console.log("media format", media.format(2)); // console.log("media maps", media.map);