DefinitelyTyped/types/classnames/classnames-tests.ts
uhyo cf258953db [classnames] improve types for classnames/bind and add types for classnames/dedupe (#36458)
* enable classnames/bind usage without bind

* add test for classnames/bind

* add classnames/dedupe support

* same default export trick for classnames/bind

* add me to definition author

* add dedupe.d.ts to files
2019-07-02 09:41:39 -07:00

53 lines
2.0 KiB
TypeScript

import classNames = require('classnames');
import * as classNames2 from 'classnames';
import * as cn from 'classnames/bind';
import classNamesDedupe = require('classnames/dedupe');
import * as classNamesDedupe2 from 'classnames/dedupe';
classNames2('foo', 'bar'); // => 'foo bar'
classNames('foo', 'bar'); // => 'foo bar'
classNames('foo', { bar: true }); // => 'foo bar'
classNames({ foo: true }, { bar: true }); // => 'foo bar'
classNames({ foo: true, bar: true }); // => 'foo bar'
classNames(10, 11); // => '10 11';
// lots of arguments of various types
classNames('foo', { bar: true, duck: false }, 'baz', { quux: true }); // => 'foo bar baz quux'
classNames(['foo', 'bar', 'baz']); // => 'foo bar baz'
classNames([1, 2, 3]); // => '1 2 3'
classNames([{ foo: true, bar: false }, { baz: true }]); // => 'foo baz'
classNames(['foo', ['bar', { baz: true }]]); // => 'foo bar baz'
// falsey values are just ignored
classNames(null, 'bar', undefined, 0, 1, { baz: null }, ''); // => 'bar 1'
// Supporting booleans is tricky since we should only support passing in false, which is ignored
// classNames(false, 'bar', 0, 1, { baz: null }, ''); // => 'bar 1'
// Support for CSS-Modules. Example from README:
// https://github.com/JedWatson/classnames/blob/master/README.md#alternate-bind-version-for-css-modules
const styles = {
foo: 'abc',
bar: 'def',
baz: 'xyz',
};
const cx = cn.bind(styles);
const className = cx('foo', ['bar'], { baz: true }); // => "abc def xyz"
// falsey values are just ignored
cx(null, 'bar', undefined, 0, 1, { baz: null }, ''); // => 'bar 1'
// true is just ignored
cx(true || 'foo');
// export of classnames/bind can be used the same as normal classnames
cn(null, 'bar', undefined, 1, ['foo', 'bar', { baz: true }], '');
// classnames/dedupe has same usage as normal classnames
classNamesDedupe('foo', { bar: true, duck: false }, 'baz', { quux: true }); // => 'foo bar baz quux'
classNamesDedupe2('foo', { bar: true, duck: false }, 'baz', { quux: true }); // => 'foo bar baz quux'