Skip to content

Commit e9f69be

Browse files
authored
feat(type): value support generics (#201)
* feat(type): value support generics * chore: pins types-ramda@0.29.6 * chore: bump typescript from 4.9.4 to 5.3.0
1 parent ff3c898 commit e9f69be

File tree

2 files changed

+27
-13
lines changed

2 files changed

+27
-13
lines changed

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@
7878
"react": "^18.0.0",
7979
"react-dom": "^18.0.0",
8080
"ts-node": "^10.9.1",
81-
"typescript": "^4.9.4"
81+
"typescript": "^5.3.0"
8282
},
8383
"peerDependencies": {
8484
"react": ">=16.0.0",

src/index.tsx

+26-12
Original file line numberDiff line numberDiff line change
@@ -10,25 +10,31 @@ export type SegmentedValue = string | number;
1010

1111
export type SegmentedRawOption = SegmentedValue;
1212

13-
export interface SegmentedLabeledOption {
13+
export interface SegmentedLabeledOption<ValueType = SegmentedRawOption> {
1414
className?: string;
1515
disabled?: boolean;
1616
label: React.ReactNode;
17-
value: SegmentedRawOption;
17+
value: ValueType;
1818
/**
1919
* html `title` property for label
2020
*/
2121
title?: string;
2222
}
2323

24-
type SegmentedOptions = (SegmentedRawOption | SegmentedLabeledOption)[];
25-
26-
export interface SegmentedProps
27-
extends Omit<React.HTMLProps<HTMLDivElement>, 'onChange'> {
28-
options: SegmentedOptions;
29-
defaultValue?: SegmentedValue;
30-
value?: SegmentedValue;
31-
onChange?: (value: SegmentedValue) => void;
24+
type SegmentedOptions<T = SegmentedRawOption> = (
25+
| T
26+
| SegmentedLabeledOption<T>
27+
)[];
28+
29+
export interface SegmentedProps<ValueType = SegmentedValue>
30+
extends Omit<
31+
React.HTMLProps<HTMLDivElement>,
32+
'defaultValue' | 'value' | 'onChange'
33+
> {
34+
options: SegmentedOptions<ValueType>;
35+
defaultValue?: ValueType;
36+
value?: ValueType;
37+
onChange?: (value: ValueType) => void;
3238
disabled?: boolean;
3339
prefixCls?: string;
3440
direction?: 'ltr' | 'rtl';
@@ -219,6 +225,14 @@ const Segmented = React.forwardRef<HTMLDivElement, SegmentedProps>(
219225
},
220226
);
221227

222-
Segmented.displayName = 'Segmented';
228+
if (process.env.NODE_ENV !== 'production') {
229+
Segmented.displayName = 'Segmented';
230+
}
231+
232+
const TypedSegmented = Segmented as <ValueType>(
233+
props: SegmentedProps<ValueType> & {
234+
ref?: React.ForwardedRef<HTMLDivElement>;
235+
},
236+
) => ReturnType<typeof Segmented>;
223237

224-
export default Segmented;
238+
export default TypedSegmented;

0 commit comments

Comments
 (0)