// @ts-nocheck /** * 类名属性类型 * @description 支持 string、number、null、undefined、对象和数组类型 */ // #ifndef UNI-APP-X type UTSJSONObject = Record // #endif export type ClassProp = | string | number | null | undefined | UTSJSONObject | ClassProp[] /** * 把各种类型的参数拼接成字符串类名,以便解决小程序不支持 classObject 的问题 * @description 支持多种参数类型的类名拼接,包括字符串、数字、数组和对象 * @param args 类名参数,可以是字符串、数字、null、undefined、对象或数组 * @returns 拼接后的类名字符串 * @example * classNames('foo', 'bar') // 'foo bar' * classNames('foo', { bar: true, baz: false }) // 'foo bar' * classNames('foo', ['bar', 'baz']) // 'foo bar baz' * classNames('foo', null, 'bar') // 'foo bar' * classNames({ foo: true, bar: false, baz: true }) // 'foo baz' */ // export function classNames(args:ClassProp[]): string export function classNames(...args : ClassProp[]) : string { return classNamesArray(args) } /** * 处理数组的类名 * @description 用于内部递归处理数组类型的类名 * @param args 类名数组 * @returns 拼接后的类名字符串 */ export function classNamesArray(args : ClassProp[]) : string { const result : string[] = [] for (let i = 0; i < args.length; i++) { const arg = args[i] if (arg == null) { continue } if (typeof arg == 'string') { const trimmed = (arg as string).trim() if (trimmed != '') { result.push(trimmed) } } else if (typeof arg == 'number') { if (isFinite(arg as number)) { result.push(`${arg}`) } } else if (Array.isArray(arg)) { if ((arg as ClassProp[]).length > 0) { const className = classNamesArray(arg) if (className != '') { result.push(className) } } } else if (typeof arg == 'object') { // #ifndef UNI-APP-X && APP for (const key in arg) { const value = arg[key] if (value == true) { result.push(key) } } // #endif // #ifdef UNI-APP-X && APP // #ifdef VUE3-VAPOR for (const key in arg) { const value = arg[key] if (value == true) { result.push(key) } } // #endif // #ifndef VUE3-VAPOR UTSJSONObject.assign({}, arg as UTSJSONObject).toMap().forEach((value, key) => { if (value == true) { result.push(key) } }) // #endif // #endif } } return result.join(' ') }