feat: 简化字典函数

master
绝弹 2023-07-18 17:21:27 +08:00 committed by GitHub
parent 23738a4987
commit e6a83318bc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 22 additions and 37 deletions

View File

@ -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<A, K, [...B, A[B["length"]][K]]>;
type ArrayFind<A extends readonly Item[], V extends A[number]["value"]> = A extends readonly [
infer I extends Item,
...infer R extends Item[]
]
? I["value"] extends V
? I["label"]
: ArrayFind<R, V>
: "nev1er";
type MergeIntersection<A> = A extends infer T ? { [Key in keyof T]: T[Key] } : never; type MergeIntersection<A> = A extends infer T ? { [Key in keyof T]: T[Key] } : never;
@ -27,22 +13,22 @@ type ConstantType<T extends readonly Item[]> = 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; format<K extends T[number]["value"]>(value: K, key?: keyof T[number]): any;
/**
*
*/
map: {
[k in T[number] as k["value"]]: k;
};
/** /**
* *
*/ */
values: ArrayMap<T, "value">; values: any[];
/**
*
*/
prop<K extends keyof T[number]>(key: K): T[number][K][];
/** /**
* *
*/ */
@ -52,15 +38,15 @@ type ConstantType<T extends readonly Item[]> = MergeIntersection<
*/ */
omit(...values: T[number]["value"][]): Item[]; omit(...values: T[number]["value"][]): Item[];
/** /**
* *
*/ */
each<K extends keyof T[number]>(key: K): T[number][K][]; raw: T;
/** /**
* *
* @param value value
* @param key label
*/ */
format<K extends T[number]["value"]>(value: K, key?: keyof T[number]): ArrayFind<T, K>; map: {
[k in T[number]as k["value"]]: k;
};
} }
>; >;
@ -68,19 +54,18 @@ type ConstantType<T extends readonly Item[]> = MergeIntersection<
* *
*/ */
class Constanter { class Constanter {
// @ts-ignore raw: Item[] = [];
items: Item[];
pick(...values: any[]) { pick(...values: any[]) {
return this.items.filter((item) => values.includes(item.value)); return this.raw.filter((item) => values.includes(item.value));
} }
omit(...values: any[]) { omit(...values: any[]) {
return this.items.filter((item) => !values.includes(item.value)); return this.raw.filter((item) => !values.includes(item.value));
} }
each(key: string) { each(key: string) {
return this.items.map((item) => item[key]); return this.raw.map((item) => item[key]);
} }
format(value: any, key: string = "label") { 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<T extends readonly Item[]>(items: T): ConstantTy
// console.log("media", media, media.VIDEO, media.IMAGE, media.TEXT); // console.log("media", media, media.VIDEO, media.IMAGE, media.TEXT);
// console.log("media pick", media.pick(media.VIDEO)); // console.log("media pick", media.pick(media.VIDEO));
// console.log("media omit", media.omit(media.TEXT)); // 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 format", media.format(2));
// console.log("media maps", media.map); // console.log("media maps", media.map);