interface ClassArray extends Array<ClassValue> {}
interface ClassDictionary {
[id: string]: any;
}
type ClassValue = string | number | ClassDictionary | ClassArray | undefined | null | boolean;
export default function classNames(...args: ClassValue[]): string {
const classes: ClassValue[] = [];
const { length } = args;
for ( let index = 0; index < length ; index++ ){
const arg: ClassValue = args[index];
if(arg){
const argType: string = typeof arg;
if (argType === 'string' || argType === ''number) {
classes.push(arg);
}else if (Array.isArray(arg) && arg.length) {
const inner: string = className.call(null, ...arg);
if (inner) {
classes.push(inner);
}
}else if (argType === 'object') {
const inner: string = Object.keys(arg)
.filter((key)=> arg[key])
.join(' ');
if(inner) {
classes.push(inner);
}
}
}
}
return classes.join(' ');
}