@@ -5,12 +5,12 @@ import type {
55} from "react"
66
77/** Multipurpose generic
8- * @example ClassNames<true> === {className: string}
9- * @example ClassNames<"class1"|"class2"> === {classnames: {class1: undefined|string, class2: undefined|string}}
10- * @example ClassNames<Props1, Props2> === {classnames: Props1["classnames"] & Props2["classnames"]}
11- * @example ClassNames<true, "class1", Props, typeof Component1, typeof FunctionalComponent>
8+ * @example
9+ * ClassNames<true> // {className: string}
10+ * ClassNames<Props1> // {classnames: Props1["classnames"] & Props2["classnames"]}
11+ * ClassNames<typeof Component>
12+ * ClassNames<true, Props, typeof ClassComponent, typeof FunctionalComponent>
1213 */
13-
1414export type ClassNames <
1515 C0 extends true | ReactRelated ,
1616 C1 extends ReactRelated = never ,
@@ -39,13 +39,19 @@ export type ClassNames<
3939 & Ever < C10 , ClassNamesFrom < C10 > >
4040>
4141
42+ /** Declaration of self Component's classNames
43+ * @example
44+ * ClassNames<{class1: ClassHash, class2: ClassHash}>
45+ * ClassNames<typeof some_module_css, {class1: ClassHash, class2: ClassHash}>
46+ */
4247export type ClassNamesProperty <
4348C extends CssModule , T extends { [ K in keyof C ] ?: ClassHash } = C
4449> = { classnames : { [ K in keyof T & keyof C ] : ClassHash } }
45- type ClassNamesCombiner < C extends CssModule > = Ever < C , Ever < keyof C , { classnames : { [ K in keyof C ] : ClassHash } } > >
4650
51+ /** Primitive for global CSS and CSS module */
4752export type ClassHash = undefined | string
4853
54+ /** Shortcut to require property `className` */
4955export type ClassNamed = {
5056 className : string
5157}
@@ -58,6 +64,7 @@ export type ClassNamingContext<T extends CssModule> = Partial<ClassNamed> & {
5864}
5965
6066/// iNTERNAL
67+ type ClassNamesCombiner < C extends CssModule > = Ever < C , Ever < keyof C , { classnames : { [ K in keyof C ] : ClassHash } } > >
6168type WithClassNames = { classnames : CssModule }
6269
6370export type CssModule = Record < string , ClassHash >
@@ -72,6 +79,7 @@ export type GetProps<C> = C extends JSXElementConstructor<infer P> ? P : C
7279/// REACT
7380
7481export type ReactRelated = ( AnyObject & WithClassNames ) | RFC | RCC
82+ //TODO Is there any way to require `classnames` in `props`?
7583type RFC = ( props : any ) => ReactElement < any , any > | null
7684type RCC = new ( props : any ) => Component < AnyObject & WithClassNames , any >
7785
0 commit comments