diff --git a/components/segmented/demo/basic.tsx b/components/segmented/demo/basic.tsx index b0cfedff2c..5da7cfcc6d 100644 --- a/components/segmented/demo/basic.tsx +++ b/components/segmented/demo/basic.tsx @@ -2,7 +2,12 @@ import React from 'react'; import { Segmented } from 'antd'; const Demo: React.FC = () => ( - + + options={['Daily', 'Weekly', 'Monthly', 'Quarterly', 'Yearly']} + onChange={(value) => { + console.log(value); // string + }} + /> ); export default Demo; diff --git a/components/segmented/index.tsx b/components/segmented/index.tsx index 5b32cdaba0..bdc8069330 100644 --- a/components/segmented/index.tsx +++ b/components/segmented/index.tsx @@ -2,6 +2,7 @@ import classNames from 'classnames'; import type { SegmentedLabeledOption as RcSegmentedLabeledOption, SegmentedProps as RCSegmentedProps, + SegmentedValue as RcSegmentedValue, SegmentedRawOption, } from 'rc-segmented'; import RcSegmented from 'rc-segmented'; @@ -13,11 +14,13 @@ import useStyle from './style'; export type { SegmentedValue } from 'rc-segmented'; -interface SegmentedLabeledOptionWithoutIcon extends RcSegmentedLabeledOption { +interface SegmentedLabeledOptionWithoutIcon + extends RcSegmentedLabeledOption { label: RcSegmentedLabeledOption['label']; } -interface SegmentedLabeledOptionWithIcon extends Omit { +interface SegmentedLabeledOptionWithIcon + extends Omit, 'label'> { label?: RcSegmentedLabeledOption['label']; /** Set icon for Segmented item */ icon: React.ReactNode; @@ -29,20 +32,23 @@ function isSegmentedLabeledOptionWithIcon( return typeof option === 'object' && !!(option as SegmentedLabeledOptionWithIcon)?.icon; } -export type SegmentedLabeledOption = - | SegmentedLabeledOptionWithIcon - | SegmentedLabeledOptionWithoutIcon; +export type SegmentedLabeledOption = + | SegmentedLabeledOptionWithIcon + | SegmentedLabeledOptionWithoutIcon; -export interface SegmentedProps extends Omit { +export type SegmentedOptions = (T | SegmentedLabeledOption)[]; + +export interface SegmentedProps + extends Omit, 'size' | 'options'> { rootClassName?: string; - options: (SegmentedRawOption | SegmentedLabeledOption)[]; + options: SegmentedOptions; /** Option to fit width to its parent's width */ block?: boolean; /** Option to control the display size */ size?: SizeType; } -const Segmented = React.forwardRef((props, ref) => { +const InternalSegmented = React.forwardRef((props, ref) => { const { prefixCls: customizePrefixCls, className, @@ -111,6 +117,11 @@ const Segmented = React.forwardRef((props, ref) ); }); +const Segmented = InternalSegmented as (( + props: SegmentedProps & React.RefAttributes, +) => ReturnType) & + Pick; + if (process.env.NODE_ENV !== 'production') { Segmented.displayName = 'Segmented'; } diff --git a/package.json b/package.json index 7b97b711ad..8ae161a70f 100644 --- a/package.json +++ b/package.json @@ -148,7 +148,7 @@ "rc-progress": "~3.5.1", "rc-rate": "~2.12.0", "rc-resize-observer": "^1.4.0", - "rc-segmented": "~2.2.2", + "rc-segmented": "~2.3.0", "rc-select": "~14.11.0", "rc-slider": "~10.5.0", "rc-steps": "~6.0.1",