|
1 | | -import * as React from 'react'; |
2 | 1 | import * as PopperJS from '@popperjs/core'; |
| 2 | +import * as React from 'react'; |
| 3 | + |
| 4 | +// Utility type |
| 5 | +type UnionWhere<U, M> = U extends M ? U : never; |
3 | 6 |
|
4 | 7 | interface ManagerProps { |
5 | 8 | children: React.ReactNode; |
@@ -37,16 +40,30 @@ export interface PopperChildrenProps { |
37 | 40 | arrowProps: PopperArrowProps; |
38 | 41 | } |
39 | 42 |
|
40 | | -export interface PopperProps { |
| 43 | +type StrictModifierNames = NonNullable<PopperJS.StrictModifiers['name']>; |
| 44 | + |
| 45 | +type StrictModifier<Name extends StrictModifierNames> = UnionWhere< |
| 46 | + PopperJS.StrictModifiers, |
| 47 | + { name?: Name } |
| 48 | +>; |
| 49 | + |
| 50 | +type Modifier<Name> = Name extends StrictModifierNames |
| 51 | + ? StrictModifier<Name> |
| 52 | + : Partial<PopperJS.Modifier<Name, object>>; |
| 53 | + |
| 54 | +export interface PopperProps<Modifiers> { |
41 | 55 | children: (props: PopperChildrenProps) => React.ReactNode; |
42 | 56 | innerRef?: React.Ref<any>; |
43 | | - modifiers?: Array<Partial<PopperJS.Modifier<any>>>; |
| 57 | + modifiers?: ReadonlyArray<Modifier<Modifiers>>; |
44 | 58 | placement?: PopperJS.Placement; |
45 | 59 | strategy?: PopperJS.PositioningStrategy; |
46 | 60 | referenceElement?: HTMLElement | PopperJS.VirtualElement; |
47 | 61 | onFirstUpdate?: (state: Partial<PopperJS.State>) => void; |
48 | 62 | } |
49 | | -export class Popper extends React.Component<PopperProps, {}> {} |
| 63 | +export class Popper<Modifiers> extends React.Component< |
| 64 | + PopperProps<Modifiers>, |
| 65 | + {} |
| 66 | +> {} |
50 | 67 |
|
51 | 68 | export function usePopper( |
52 | 69 | referenceElement?: Element | null, |
|
0 commit comments