From 4c8de646d1b0b229abad5a89ddbaf2cda694d4e1 Mon Sep 17 00:00:00 2001 From: zombiej Date: Mon, 20 Dec 2021 14:25:39 +0800 Subject: [PATCH] chore: types support generic --- src/Cascader.tsx | 46 +++++++++++++++++++++++++++++++++++++++++++--- src/index.tsx | 9 +++++++-- src/interface.ts | 47 ----------------------------------------------- 3 files changed, 50 insertions(+), 52 deletions(-) delete mode 100644 src/interface.ts diff --git a/src/Cascader.tsx b/src/Cascader.tsx index ee9f17c4..4dd297e7 100644 --- a/src/Cascader.tsx +++ b/src/Cascader.tsx @@ -54,7 +54,7 @@ export interface DefaultOptionType extends BaseOptionType { children?: DefaultOptionType[]; } -export interface CascaderProps +interface BaseCascaderProps extends Omit< BaseSelectPropsWithoutPrivate, 'tokenSeparators' | 'labelInValue' | 'mode' | 'showSearch' @@ -109,6 +109,40 @@ export interface CascaderProps = (value: SingleValueType, selectOptions: OptionType[]) => void; +type OnMultipleChange = ( + value: SingleValueType[], + selectOptions: OptionType[][], +) => void; + +export interface SingleCascaderProps + extends BaseCascaderProps { + checkable?: false; + + onChange?: OnSingleChange; +} + +export interface MultipleCascaderProps + extends BaseCascaderProps { + checkable: true | React.ReactNode; + + onChange?: OnMultipleChange; +} + +export type CascaderProps = + | SingleCascaderProps + | MultipleCascaderProps; + +type InternalCascaderProps = Omit< + SingleCascaderProps | MultipleCascaderProps, + 'onChange' +> & { + onChange?: ( + value: SingleValueType | SingleValueType[], + selectOptions: OptionType[] | OptionType[][], + ) => void; +}; + export type CascaderRef = Omit; function isMultipleValue(value: ValueType): value is SingleValueType[] { @@ -127,7 +161,7 @@ function toRawValues(value: ValueType): SingleValueType[] { return value.length === 0 ? [] : [value]; } -const Cascader = React.forwardRef((props, ref) => { +const Cascader = React.forwardRef((props, ref) => { const { // MISC id, @@ -455,7 +489,13 @@ const Cascader = React.forwardRef((props, ref) => { /> ); -}); +}) as (( + props: React.PropsWithChildren> & { + ref?: React.Ref; + }, +) => React.ReactElement) & { + displayName?: string; +}; if (process.env.NODE_ENV !== 'production') { Cascader.displayName = 'Cascader'; diff --git a/src/index.tsx b/src/index.tsx index 36e90171..51366595 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -1,5 +1,10 @@ import Cascader from './Cascader'; -export type { CascaderProps } from './Cascader'; -export type { FieldNames, DataNode, ShowSearchType } from './interface'; +export type { + CascaderProps, + FieldNames, + ShowSearchType, + DefaultOptionType, + BaseOptionType, +} from './Cascader'; export default Cascader; diff --git a/src/interface.ts b/src/interface.ts deleted file mode 100644 index 09522508..00000000 --- a/src/interface.ts +++ /dev/null @@ -1,47 +0,0 @@ -import type * as React from 'react'; - -export interface FieldNames { - value?: string; - label?: string; - children?: string; -} - -export type CascaderValueType = React.Key[]; - -export interface DataNode { - label: React.ReactNode; - /** Customize hover title */ - title?: string; - value: string | number; - disabled?: boolean; - children?: DataNode[]; - isLeaf?: boolean; -} - -export interface InternalDataNode extends DataNode { - node: DataNode; -} - -export interface OptionDataNode extends Omit { - title: React.ReactNode; - children?: OptionDataNode[]; -} -export interface FlattenDataNode { - key: React.Key; - data: DataNode; - path: React.Key[]; - parent?: FlattenDataNode; -} - -export interface ShowSearchType { - filter?: (inputValue: string, options: DataNode[], fieldNames: FieldNames) => boolean; - render?: ( - inputValue: string, - path: DataNode[], - prefixCls: string, - fieldNames: FieldNames, - ) => React.ReactNode; - sort?: (a: DataNode[], b: DataNode[], inputValue: string, fieldNames: FieldNames) => number; - matchInputWidth?: boolean; - limit?: number | false; -}