Skip to content

Commit

Permalink
feat(type): value support generics (#201)
Browse files Browse the repository at this point in the history
* feat(type): value support generics

* chore: pins types-ramda@0.29.6

* chore: bump typescript from 4.9.4 to 5.3.0
  • Loading branch information
madocto committed Jan 22, 2024
1 parent ff3c898 commit e9f69be
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 13 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@
"react": "^18.0.0",
"react-dom": "^18.0.0",
"ts-node": "^10.9.1",
"typescript": "^4.9.4"
"typescript": "^5.3.0"
},
"peerDependencies": {
"react": ">=16.0.0",
Expand Down
38 changes: 26 additions & 12 deletions src/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,25 +10,31 @@ export type SegmentedValue = string | number;

export type SegmentedRawOption = SegmentedValue;

export interface SegmentedLabeledOption {
export interface SegmentedLabeledOption<ValueType = SegmentedRawOption> {
className?: string;
disabled?: boolean;
label: React.ReactNode;
value: SegmentedRawOption;
value: ValueType;
/**
* html `title` property for label
*/
title?: string;
}

type SegmentedOptions = (SegmentedRawOption | SegmentedLabeledOption)[];

export interface SegmentedProps
extends Omit<React.HTMLProps<HTMLDivElement>, 'onChange'> {
options: SegmentedOptions;
defaultValue?: SegmentedValue;
value?: SegmentedValue;
onChange?: (value: SegmentedValue) => void;
type SegmentedOptions<T = SegmentedRawOption> = (
| T
| SegmentedLabeledOption<T>
)[];

export interface SegmentedProps<ValueType = SegmentedValue>
extends Omit<
React.HTMLProps<HTMLDivElement>,
'defaultValue' | 'value' | 'onChange'
> {
options: SegmentedOptions<ValueType>;
defaultValue?: ValueType;
value?: ValueType;
onChange?: (value: ValueType) => void;
disabled?: boolean;
prefixCls?: string;
direction?: 'ltr' | 'rtl';
Expand Down Expand Up @@ -219,6 +225,14 @@ const Segmented = React.forwardRef<HTMLDivElement, SegmentedProps>(
},
);

Segmented.displayName = 'Segmented';
if (process.env.NODE_ENV !== 'production') {
Segmented.displayName = 'Segmented';
}

const TypedSegmented = Segmented as <ValueType>(
props: SegmentedProps<ValueType> & {
ref?: React.ForwardedRef<HTMLDivElement>;
},
) => ReturnType<typeof Segmented>;

export default Segmented;
export default TypedSegmented;

0 comments on commit e9f69be

Please sign in to comment.