refactor: better types for cx

This commit is contained in:
EnixCoda 2021-05-23 02:04:50 +08:00
parent 45828116fe
commit e7ad0917e9
No known key found for this signature in database
GPG key ID: 0C1A07377913A1DD

View file

@ -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<typeof cx>[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
}
}