import type { AnyRecord } from "../type/index.ts" import { isDate } from "./is.ts" /** * @description Return a new object that includes only the specified keys from the source object. * * @example * ``` * // Expect: { a: 1, c: 3 } * const example1 = includeFields({ a: 1, b: 2, c: 3 }, ["a", "c"]) * // Expect: {} * const example2 = includeFields(null, ["a"]) * ``` */ export const includeFields = ( object: T | null | undefined, keys: K[], ): Pick => { if (object === null || object === undefined) { return {} as Pick } const newObject: Partial> = {} // 初始化一个部分类型的对象 keys.forEach((key) => { if (key in object) { newObject[key] = object[key] } }) return newObject as Pick // 使用正确的变量名并断言返回类型 } /** * @description Return a new object that excludes the specified keys from the source object. * * @example * ``` * // Expect: { a: 1 } * const example1 = excludeFields({ a: 1, b: 2 }, ["b"]) * // Expect: {} * const example2 = excludeFields(undefined, ["a"]) * ``` */ export const excludeFields = ( object: T | null | undefined, keys: K[], ): Omit => { if (object === null || object === undefined) { return {} as Omit } const newObject: Partial = { ...object } // 创建原对象的浅拷贝 keys.forEach((key) => { delete newObject[key] // 删除指定的键 }) return newObject as Omit // 使用Omit类型确保返回的类型反映了被排除的键 } /** * @description Convert all Date fields in an object to number. * * @example * ```before * type Obj = { * createdAt: Date, * } * ``` * ```after * type Obj = { * createdAt: number, * } * ``` * * @example * ```before * type Obj = { * createdAt: Date | undefined, * } * ``` * ```after * type Obj = { * createdAt: number | undefined, * } * ``` * * @example * ```before * type Obj = { * createdAt: Date | null, * } * ``` * ```after * type Obj = { * createdAt: number | null, * } * ``` */ export type ObjectDateFieldsToNumber = { [K in keyof O]: O[K] extends Date ? number : O[K] extends Date | undefined ? number | undefined : O[K] extends Date | null ? number | null : O[K] extends object ? ObjectDateFieldsToNumber : O[K] } /** * @description Convert all Date fields in an object to number. * * @example * ``` * const obj = { createdAt: new Date() }; * const result = objectDateFieldsToNumber(obj); * // Expect: { createdAt: 1712345678901 } * ``` */ export const objectDateFieldsToNumber = >( obj: O, ): ObjectDateFieldsToNumber => { // oxlint-disable-next-line guard-for-in for (const key in obj) { const value = obj[key] if (isDate(value)) { obj[key] = value.getTime() as O[Extract] } } return obj as ObjectDateFieldsToNumber }