import { z } from 'zod'; /** * 返回对象的可枚举属性和方法的名称 * - `Object.keys` 始终返回 `string[]` 类型,此函数可以返回具体类型 * * @param {O} object 对象 * @returns {(keyof O)[]} 对象所有可枚举的属性的键名 */ export function ObjectKeys(object: O): (keyof O)[] { return Object.keys(object); } /** * 返回对象的可枚举属性的值数组 * * @param {O} object 对象 */ export function ObjectValues(object: O): O[keyof O][] { return Object.values(object) as O[keyof O][]; } /** * 返回对象的可枚举属性的键/值数组 * - 与 `ObjectEntriesRecord` 方法仅返回类型具体程度的区别 * * @param {O} object 对象 */ export function ObjectEntries(object: O) { return Object.entries(object) as [keyof O, O[keyof O]][]; } /** * 返回对象的可枚举属性的键/值数组 * - 与 `ObjectEntries` 方法仅返回类型具体程度的区别 * * @param {{ [K in keyof O]: O[K] }} object 对象 */ export function ObjectEntriesRecord>(object: { [K in keyof O]: O[K] }) { return Object.entries(object) as [keyof O, O[keyof O]][]; } /** * 返回交换了对象的可枚举属性的值/键对象 * * @param {O} object 对象 */ export function ObjectSwitch>(object: Required) { const result = {} as unknown as Recordable; for (const [k, v] of EnumEntries(object)) { result[v] = k; } return result; } /** * 获取枚举所有属性的键 * * @param {E} enums 枚举 */ export function EnumKeys>(enums: E): [keyof E, ...(keyof E)[]] { const e = z.record(z.unknown()).parse(enums) as E; const keys = z .array(z.string()) .nonempty({ message: 'Enum Keys must contain at least 1 element(s)' }) .parse(ObjectKeys(e)) as [keyof E, ...(keyof E)[]]; const values = ObjectValues(e); const isNumEnum = keys.every((k) => values.some((v) => `${v}` === k)); if (isNumEnum) return keys.splice(keys.length / 2, keys.length / 2) as [keyof E, ...(keyof E)[]]; return keys; } /** * 获取枚举所有属性的值 * * @param {E} enums 枚举 */ export function EnumValues>(enums: E): E[keyof E][] { const e = z.record(z.unknown()).parse(enums) as E; const keys = z .array(z.string()) .nonempty({ message: 'Enum Keys must contain at least 1 element(s)' }) .parse(ObjectKeys(e)); const values = ObjectValues(e); const isNumEnum = keys.every((k) => values.some((v) => `${v}` === k)); if (isNumEnum) return values.splice(keys.length / 2, keys.length / 2); return values; } /** * 返回枚举的属性的键/值数组 * * @param {E} enums 枚举 */ export function EnumEntries>(enums: E): [keyof E, E[keyof E]][] { const e = z.record(z.unknown()).parse(enums) as E; const keys = z .array(z.string()) .nonempty({ message: 'Enum Keys must contain at least 1 element(s)' }) .parse(ObjectKeys(e)); const values = ObjectValues(e); const entries = ObjectEntries(e); const isNumEnum = keys.every((k) => values.some((v) => `${v}` === k)); if (isNumEnum) return entries.splice(keys.length / 2, keys.length / 2); return entries; }