diff --git a/src/utils/cx.ts b/src/utils/cx.ts index 179b6d3..01ea737 100644 --- a/src/utils/cx.ts +++ b/src/utils/cx.ts @@ -1,18 +1,28 @@ +type CXValue = string | boolean | null | undefined + /** * cx('class1', { class2: true, class3: false }) --> 'class1 class2' */ -export function cx(...classNames: any[]): string { - return classNames - .filter(Boolean) - .map(className => { - switch (typeof className) { - case 'string': - return className - case 'object': - return cx(...Object.entries(className).map(([key, value]) => (value ? key : null))) - default: - return '' +export function cx( + ...classNames: ( + | CXValue + | { + [className: string]: CXValue } - }) - .join(' ') + )[] +): string { + return classNames.map(handleClassName).filter(Boolean).join(' ') +} + +function handleClassName(className: Parameters[number]): string | false { + switch (typeof className) { + case 'string': + return className + case 'object': + return className === null + ? false + : cx(...Object.entries(className).map(([key, value]) => (value ? key : false))) + default: + return false + } }