fix: typescript compile error

pull/4675/head
Amour1688 2021-09-18 20:14:56 +08:00 committed by tangjinzhou
parent 6b1f38cd4e
commit aa9ba7fc5a
8 changed files with 237 additions and 133 deletions

View File

@ -1,10 +1,9 @@
import type { Dayjs } from 'dayjs';
import generateConfig from '../vc-picker/generate/dayjs'; import generateConfig from '../vc-picker/generate/dayjs';
import { withInstall } from '../_util/type'; import { withInstall } from '../_util/type';
import type { CalendarProps } from './generateCalendar'; import type { CalendarProps } from './generateCalendar';
import generateCalendar from './generateCalendar'; import generateCalendar from './generateCalendar';
const Calendar = generateCalendar<Dayjs>(generateConfig); const Calendar = generateCalendar(generateConfig);
export type { CalendarProps }; export type { CalendarProps };
export default withInstall(Calendar); export default withInstall(Calendar);

View File

@ -65,7 +65,10 @@ export interface CalendarProps<DateType> {
valueFormat?: string; valueFormat?: string;
} }
function generateCalendar<DateType>(generateConfig: GenerateConfig<DateType>) { function generateCalendar<
DateType,
Props extends CalendarProps<DateType> = CalendarProps<DateType>,
>(generateConfig: GenerateConfig<DateType>) {
function isSameYear(date1: DateType, date2: DateType) { function isSameYear(date1: DateType, date2: DateType) {
return date1 && date2 && generateConfig.getYear(date1) === generateConfig.getYear(date2); return date1 && date2 && generateConfig.getYear(date1) === generateConfig.getYear(date2);
} }
@ -82,28 +85,9 @@ function generateCalendar<DateType>(generateConfig: GenerateConfig<DateType>) {
); );
} }
const Calendar = defineComponent<CalendarProps<DateType>>({ const Calendar = defineComponent<Props>({
name: 'ACalendar', name: 'ACalendar',
inheritAttrs: false, inheritAttrs: false,
props: [
'prefixCls',
'locale',
'validRange',
'disabledDate',
'dateFullCellRender',
'dateCellRender',
'monthFullCellRender',
'monthCellRender',
'headerRender',
'value',
'defaultValue',
'mode',
'fullscreen',
'onChange',
'onPanelChange',
'onSelect',
'valueFormat',
] as any,
emits: ['change', 'panelChange', 'select', 'update:value'], emits: ['change', 'panelChange', 'select', 'update:value'],
slots: [ slots: [
'dateFullCellRender', 'dateFullCellRender',
@ -303,7 +287,6 @@ function generateCalendar<DateType>(generateConfig: GenerateConfig<DateType>) {
onModeChange={triggerModeChange} onModeChange={triggerModeChange}
/> />
)} )}
<PickerPanel <PickerPanel
value={mergedValue.value} value={mergedValue.value}
prefixCls={prefixCls.value} prefixCls={prefixCls.value}
@ -322,11 +305,33 @@ function generateCalendar<DateType>(generateConfig: GenerateConfig<DateType>) {
}; };
}, },
}); });
Calendar.props = [
'prefixCls',
'locale',
'validRange',
'disabledDate',
'dateFullCellRender',
'dateCellRender',
'monthFullCellRender',
'monthCellRender',
'headerRender',
'value',
'defaultValue',
'mode',
'fullscreen',
'onChange',
'onPanelChange',
'onSelect',
'valueFormat',
];
Calendar.install = function (app: App) { Calendar.install = function (app: App) {
app.component(Calendar.name, Calendar); app.component(Calendar.name, Calendar);
return app; return app;
}; };
return Calendar;
return Calendar as unknown as (props: CalendarProps<DateType>) => JSX.Element;
} }
export default generateCalendar; export default generateCalendar;

View File

@ -16,18 +16,18 @@ import type { PanelMode, RangeValue } from '../../vc-picker/interface';
import type { RangePickerSharedProps } from '../../vc-picker/RangePicker'; import type { RangePickerSharedProps } from '../../vc-picker/RangePicker';
import devWarning from '../../vc-util/devWarning'; import devWarning from '../../vc-util/devWarning';
export default function generateRangePicker<DateType, ExtraProps extends {} = {}>( export default function generateRangePicker<DateType, ExtraProps = {}>(
generateConfig: GenerateConfig<DateType>, generateConfig: GenerateConfig<DateType>,
extraProps: ExtraProps, extraProps: ExtraProps,
) { ) {
const RangePicker = defineComponent({ const RangePicker = defineComponent({
name: 'ARangePicker', name: 'ARangePicker',
inheritAttrs: false,
props: { props: {
...commonProps<DateType>(), ...commonProps<DateType>(),
...rangePickerProps<DateType>(), ...rangePickerProps<DateType>(),
...extraProps, ...extraProps,
}, },
inheritAttrs: false,
slots: [ slots: [
'suffixIcon', 'suffixIcon',
// 'clearIcon', // 'clearIcon',

View File

@ -12,6 +12,7 @@ import { computed, defineComponent, nextTick, onMounted, ref } from 'vue';
import useConfigInject from '../../_util/hooks/useConfigInject'; import useConfigInject from '../../_util/hooks/useConfigInject';
import classNames from '../../_util/classNames'; import classNames from '../../_util/classNames';
import { commonProps, datePickerProps } from './props'; import { commonProps, datePickerProps } from './props';
import devWarning from '../../vc-util/devWarning'; import devWarning from '../../vc-util/devWarning';
export default function generateSinglePicker<DateType, ExtraProps = {}>( export default function generateSinglePicker<DateType, ExtraProps = {}>(

View File

@ -1,22 +1,12 @@
import type { GenerateConfig } from '../../vc-picker/generate/index'; import type { GenerateConfig } from '../../vc-picker/generate';
import type {
PickerBaseProps as RCPickerBaseProps,
PickerDateProps as RCPickerDateProps,
PickerTimeProps as RCPickerTimeProps,
} from '../../vc-picker/Picker';
import type { SharedTimeProps } from '../../vc-picker/panels/TimePanel'; import type { SharedTimeProps } from '../../vc-picker/panels/TimePanel';
import type { import type { PickerMode } from '../../vc-picker/interface';
RangePickerBaseProps as RCRangePickerBaseProps,
RangePickerDateProps as RCRangePickerDateProps,
RangePickerTimeProps as RCRangePickerTimeProps,
} from '../../vc-picker/RangePicker';
import type { PickerMode, Locale as RcPickerLocale } from '../../vc-picker/interface';
import PickerButton from '../PickerButton'; import PickerButton from '../PickerButton';
import PickerTag from '../PickerTag'; import PickerTag from '../PickerTag';
import type { TimePickerLocale } from '../../time-picker';
import generateSinglePicker from './generateSinglePicker'; import generateSinglePicker from './generateSinglePicker';
import generateRangePicker from './generateRangePicker'; import generateRangePicker from './generateRangePicker';
import type { SizeType } from '../../config-provider';
export * from './interface';
export const Components = { button: PickerButton, rangeItem: PickerTag }; export const Components = { button: PickerButton, rangeItem: PickerTag };
@ -65,67 +55,7 @@ export function getTimeProps<DateType>(
}; };
} }
type InjectDefaultProps<Props> = Omit< function generatePicker<DateType, ExtraProps extends {} = {}>(
Props,
| 'locale'
| 'generateConfig'
| 'prevIcon'
| 'nextIcon'
| 'superPrevIcon'
| 'superNextIcon'
| 'hideHeader'
| 'components'
> & {
locale?: PickerLocale;
size?: SizeType;
bordered?: boolean;
};
export type PickerLocale = {
lang: RcPickerLocale & AdditionalPickerLocaleLangProps;
timePickerLocale: TimePickerLocale;
} & AdditionalPickerLocaleProps;
export type AdditionalPickerLocaleProps = {
dateFormat?: string;
dateTimeFormat?: string;
weekFormat?: string;
monthFormat?: string;
};
export type AdditionalPickerLocaleLangProps = {
placeholder: string;
yearPlaceholder?: string;
quarterPlaceholder?: string;
monthPlaceholder?: string;
weekPlaceholder?: string;
rangeYearPlaceholder?: [string, string];
rangeMonthPlaceholder?: [string, string];
rangeWeekPlaceholder?: [string, string];
rangePlaceholder?: [string, string];
};
// Picker Props
export type PickerBaseProps<DateType> = InjectDefaultProps<RCPickerBaseProps<DateType>>;
export type PickerDateProps<DateType> = InjectDefaultProps<RCPickerDateProps<DateType>>;
export type PickerTimeProps<DateType> = InjectDefaultProps<RCPickerTimeProps<DateType>>;
export type PickerProps<DateType> =
| PickerBaseProps<DateType>
| PickerDateProps<DateType>
| PickerTimeProps<DateType>;
// Range Picker Props
export type RangePickerBaseProps<DateType> = InjectDefaultProps<RCRangePickerBaseProps<DateType>>;
export type RangePickerDateProps<DateType> = InjectDefaultProps<RCRangePickerDateProps<DateType>>;
export type RangePickerTimeProps<DateType> = InjectDefaultProps<RCRangePickerTimeProps<DateType>>;
export type RangePickerProps<DateType> =
| RangePickerBaseProps<DateType>
| RangePickerDateProps<DateType>
| RangePickerTimeProps<DateType>;
function generatePicker<DateType, ExtraProps extends Record<string, any> = {}>(
generateConfig: GenerateConfig<DateType>, generateConfig: GenerateConfig<DateType>,
extraProps?: ExtraProps, extraProps?: ExtraProps,
) { ) {
@ -134,7 +64,7 @@ function generatePicker<DateType, ExtraProps extends Record<string, any> = {}>(
generateSinglePicker<DateType, ExtraProps>(generateConfig, extraProps); generateSinglePicker<DateType, ExtraProps>(generateConfig, extraProps);
// ======================== Range Picker ======================== // ======================== Range Picker ========================
const RangePicker = generateRangePicker<DateType>(generateConfig, extraProps); const RangePicker = generateRangePicker<DateType, ExtraProps>(generateConfig, extraProps);
return { return {
DatePicker, DatePicker,

View File

@ -0,0 +1,73 @@
import type {
PickerBaseProps as RCPickerBaseProps,
PickerDateProps as RCPickerDateProps,
PickerTimeProps as RCPickerTimeProps,
} from '../../vc-picker/Picker';
import type {
RangePickerBaseProps as RCRangePickerBaseProps,
RangePickerDateProps as RCRangePickerDateProps,
RangePickerTimeProps as RCRangePickerTimeProps,
} from '../../vc-picker/RangePicker';
import type { Locale as RcPickerLocale } from '../../vc-picker/interface';
import type { TimePickerLocale } from '../../time-picker';
import type { SizeType } from '../../config-provider';
type InjectDefaultProps<Props> = Omit<
Props,
| 'locale'
| 'generateConfig'
| 'prevIcon'
| 'nextIcon'
| 'superPrevIcon'
| 'superNextIcon'
| 'hideHeader'
| 'components'
> & {
locale?: PickerLocale;
size?: SizeType;
bordered?: boolean;
};
export type PickerLocale = {
lang: RcPickerLocale & AdditionalPickerLocaleLangProps;
timePickerLocale: TimePickerLocale;
} & AdditionalPickerLocaleProps;
export type AdditionalPickerLocaleProps = {
dateFormat?: string;
dateTimeFormat?: string;
weekFormat?: string;
monthFormat?: string;
};
export type AdditionalPickerLocaleLangProps = {
placeholder: string;
yearPlaceholder?: string;
quarterPlaceholder?: string;
monthPlaceholder?: string;
weekPlaceholder?: string;
rangeYearPlaceholder?: [string, string];
rangeMonthPlaceholder?: [string, string];
rangeWeekPlaceholder?: [string, string];
rangePlaceholder?: [string, string];
};
// Picker Props
export type PickerBaseProps<DateType> = InjectDefaultProps<RCPickerBaseProps<DateType>>;
export type PickerDateProps<DateType> = InjectDefaultProps<RCPickerDateProps<DateType>>;
export type PickerTimeProps<DateType> = InjectDefaultProps<RCPickerTimeProps<DateType>>;
export type PickerProps<DateType> =
| PickerBaseProps<DateType>
| PickerDateProps<DateType>
| PickerTimeProps<DateType>;
// Range Picker Props
export type RangePickerBaseProps<DateType> = InjectDefaultProps<RCRangePickerBaseProps<DateType>>;
export type RangePickerDateProps<DateType> = InjectDefaultProps<RCRangePickerDateProps<DateType>>;
export type RangePickerTimeProps<DateType> = InjectDefaultProps<RCRangePickerTimeProps<DateType>>;
export type RangePickerProps<DateType> =
| RangePickerBaseProps<DateType>
| RangePickerDateProps<DateType>
| RangePickerTimeProps<DateType>;

View File

@ -76,6 +76,44 @@ function commonProps<DateType>() {
}; };
} }
export interface CommonProps<DateType> {
prefixCls?: string;
dropdownClassName?: string;
dropdownAlign?: AlignType;
popupStyle?: CSSProperties;
transitionName?: string;
placeholder?: string;
allowClear?: boolean;
autofocus?: boolean;
disabled?: boolean;
tabindex?: number;
open?: boolean;
defaultOpen?: boolean;
inputReadOnly?: boolean;
suffixIcon?: VueNode;
clearIcon?: VueNode;
prevIcon?: VueNode;
nextIcon?: VueNode;
superPrevIcon?: VueNode;
superNextIcon?: VueNode;
getPopupContainer?: (triggerNode: HTMLElement) => HTMLElement;
panelRender?: (originPanel: VueNode) => VueNode;
role?: string;
name?: string;
autocomplete?: string;
direction?: 'ltr' | 'rtl';
showToday?: boolean;
showTime?: boolean | SharedTimeProps<DateType>;
locale?: PickerLocale;
size?: SizeType;
bordered?: boolean;
dateRender?: DateRender<DateType>;
disabledDate?: (date: DateType) => boolean;
mode?: PanelMode;
picker?: PickerMode;
valueFormat?: string;
}
function datePickerProps<DateType>() { function datePickerProps<DateType>() {
return { return {
defaultPickerValue: { type: [String, Object] as PropType<DateType | string> }, defaultPickerValue: { type: [String, Object] as PropType<DateType | string> },
@ -95,6 +133,19 @@ function datePickerProps<DateType>() {
}; };
} }
export interface DatePickerProps<DateType> {
defaultPickerValue?: DateType | string;
defaultValue?: DateType | string;
value?: DateType | string;
disabledTime?: DisabledTime<DateType>;
format?: string | CustomFormat<DateType> | (string | CustomFormat<DateType>)[];
renderExtraFooter?: (mode: PanelMode) => VueNode;
showNow?: boolean;
monthCellRender?: MonthCellRender<DateType>;
// deprecated Please use `monthCellRender"` instead.',
monthCellContentRender?: MonthCellRender<DateType>;
}
function rangePickerProps<DateType>() { function rangePickerProps<DateType>() {
return { return {
allowEmpty: { type: Array as unknown as PropType<[boolean, boolean]> }, allowEmpty: { type: Array as unknown as PropType<[boolean, boolean]> },
@ -124,6 +175,25 @@ function rangePickerProps<DateType>() {
}; };
} }
export interface RangePickerProps<DateType> {
allowEmpty?: [boolean, boolean];
dateRender?: RangeDateRender<DateType>;
defaultPickerValue?: [DateType, DateType] | [string, string];
defaultValue?: [DateType, DateType] | [string, string];
value?: [DateType, DateType];
disabledTime?: (date: EventValue<DateType>, type: RangeType) => DisabledTimes;
disabled?: [boolean, boolean];
format?: string;
renderExtraFooter?: () => VueNode;
separator?: string;
ranges?: Record<
string,
Exclude<RangeValue<DateType>, null> | (() => Exclude<RangeValue<DateType>, null>)
>;
placeholder?: [string, string];
mode?: [PanelMode, PanelMode];
}
export type ExtraDatePickerProps<DateType> = { export type ExtraDatePickerProps<DateType> = {
valueFormat?: string; valueFormat?: string;
defaultPickerValue?: DateType | string; defaultPickerValue?: DateType | string;

View File

@ -6,6 +6,7 @@ import {
datePickerProps, datePickerProps,
rangePickerProps, rangePickerProps,
} from '../date-picker/generatePicker/props'; } from '../date-picker/generatePicker/props';
import type { CommonProps, DatePickerProps } from '../date-picker/generatePicker/props';
import type { GenerateConfig } from '../vc-picker/generate'; import type { GenerateConfig } from '../vc-picker/generate';
import type { PanelMode, RangeValue } from '../vc-picker/interface'; import type { PanelMode, RangeValue } from '../vc-picker/interface';
import type { RangePickerSharedProps } from '../vc-picker/RangePicker'; import type { RangePickerSharedProps } from '../vc-picker/RangePicker';
@ -16,7 +17,7 @@ export interface TimePickerLocale {
rangePlaceholder?: [string, string]; rangePlaceholder?: [string, string];
} }
const timpePickerProps = { const timePickerProps = {
format: String, format: String,
showNow: { type: Boolean, default: undefined }, showNow: { type: Boolean, default: undefined },
showHour: { type: Boolean, default: undefined }, showHour: { type: Boolean, default: undefined },
@ -30,29 +31,46 @@ const timpePickerProps = {
popupClassName: String, popupClassName: String,
}; };
function createTimePicker<DateType>(generateConfig: GenerateConfig<DateType>) { export interface CommonTimePickerProps {
format?: string;
showNow?: boolean;
showHour?: boolean;
showMinute?: boolean;
showSecond?: boolean;
use12Hours?: boolean;
hourStep?: number;
minuteStep?: number;
secondStep?: number;
hideDisabledOptions?: boolean;
popupClassName?: string;
}
export type TimeRangePickerProps<T> = Omit<RangePickerTimeProps<T>, 'picker'> & {
popupClassName?: string;
valueFormat?: string;
};
export type TimePickerProps<DateType> = CommonProps<DateType> &
DatePickerProps<DateType> &
CommonTimePickerProps & {
addon?: () => void;
};
function createTimePicker<
DateType,
DTimePickerProps extends TimePickerProps<DateType> = TimePickerProps<DateType>,
DTimeRangePickerProps extends TimeRangePickerProps<DateType> = TimeRangePickerProps<DateType>,
>(generateConfig: GenerateConfig<DateType>) {
const DatePicker = generatePicker<DateType>(generateConfig, { const DatePicker = generatePicker<DateType>(generateConfig, {
...timpePickerProps, ...timePickerProps,
order: { type: Boolean, default: true }, order: { type: Boolean, default: true },
}); });
const { TimePicker: InternalTimePicker, RangePicker: InternalRangePicker } = DatePicker as any; const { TimePicker: InternalTimePicker, RangePicker: InternalRangePicker } = DatePicker as any;
type TimeRangePickerProps = Omit<RangePickerTimeProps<DateType>, 'picker'> & {
popupClassName?: string; const TimePicker = defineComponent<DTimePickerProps>({
valueFormat?: string;
};
// type TimePickerProps = Omit<PickerTimeProps<DateType>, 'picker'> & {
// popupClassName?: string;
// valueFormat?: string;
// };
const TimePicker = defineComponent({
name: 'ATimePicker', name: 'ATimePicker',
inheritAttrs: false, inheritAttrs: false,
props: {
...commonProps<DateType>(),
...datePickerProps<DateType>(),
...timpePickerProps,
addon: { type: Function },
} as any,
slot: ['addon', 'renderExtraFooter', 'suffixIcon', 'clearIcon'], slot: ['addon', 'renderExtraFooter', 'suffixIcon', 'clearIcon'],
emits: ['change', 'openChange', 'focus', 'blur', 'ok', 'update:value', 'update:open'], emits: ['change', 'openChange', 'focus', 'blur', 'ok', 'update:value', 'update:open'],
setup(props, { slots, expose, emit, attrs }) { setup(props, { slots, expose, emit, attrs }) {
@ -78,7 +96,7 @@ function createTimePicker<DateType>(generateConfig: GenerateConfig<DateType>) {
emit('update:open', open); emit('update:open', open);
emit('openChange', open); emit('openChange', open);
}; };
const onFoucs = () => { const onFocus = () => {
emit('focus'); emit('focus');
}; };
const onBlur = () => { const onBlur = () => {
@ -100,7 +118,7 @@ function createTimePicker<DateType>(generateConfig: GenerateConfig<DateType>) {
} }
onChange={onChange} onChange={onChange}
onOpenChange={onOpenChange} onOpenChange={onOpenChange}
onFocus={onFoucs} onFocus={onFocus}
onBlur={onBlur} onBlur={onBlur}
onOk={onOk} onOk={onOk}
v-slots={slots} v-slots={slots}
@ -110,15 +128,16 @@ function createTimePicker<DateType>(generateConfig: GenerateConfig<DateType>) {
}, },
}); });
const TimeRangePicker = defineComponent<TimeRangePickerProps>({ TimePicker.props = {
...commonProps<DateType>(),
...datePickerProps<DateType>(),
...timePickerProps,
addon: { type: Function },
};
const TimeRangePicker = defineComponent<DTimeRangePickerProps>({
name: 'ATimeRangePicker', name: 'ATimeRangePicker',
inheritAttrs: false, inheritAttrs: false,
props: {
...commonProps<DateType>(),
...rangePickerProps<DateType>(),
...timpePickerProps,
order: { type: Boolean, default: true },
} as any,
slot: ['renderExtraFooter', 'suffixIcon', 'clearIcon'], slot: ['renderExtraFooter', 'suffixIcon', 'clearIcon'],
emits: [ emits: [
'change', 'change',
@ -152,7 +171,7 @@ function createTimePicker<DateType>(generateConfig: GenerateConfig<DateType>) {
emit('update:open', open); emit('update:open', open);
emit('openChange', open); emit('openChange', open);
}; };
const onFoucs = () => { const onFocus = () => {
emit('focus'); emit('focus');
}; };
const onBlur = () => { const onBlur = () => {
@ -164,7 +183,7 @@ function createTimePicker<DateType>(generateConfig: GenerateConfig<DateType>) {
) => { ) => {
emit('panelChange', values, modes); emit('panelChange', values, modes);
}; };
const onOk = (values: RangeValue<string> | RangeValue<DateType>) => { const onOk = (values: RangeValue<string | DateType>) => {
emit('ok', values); emit('ok', values);
}; };
const onCalendarChange: RangePickerSharedProps<DateType>['onCalendarChange'] = ( const onCalendarChange: RangePickerSharedProps<DateType>['onCalendarChange'] = (
@ -185,7 +204,7 @@ function createTimePicker<DateType>(generateConfig: GenerateConfig<DateType>) {
ref={pickerRef} ref={pickerRef}
onChange={onChange} onChange={onChange}
onOpenChange={onOpenChange} onOpenChange={onOpenChange}
onFocus={onFoucs} onFocus={onFocus}
onBlur={onBlur} onBlur={onBlur}
onPanelChange={onPanelChange} onPanelChange={onPanelChange}
onOk={onOk} onOk={onOk}
@ -197,6 +216,13 @@ function createTimePicker<DateType>(generateConfig: GenerateConfig<DateType>) {
}, },
}); });
TimeRangePicker.props = {
...commonProps<DateType>(),
...rangePickerProps<DateType>(),
...timePickerProps,
order: { type: Boolean, default: true },
};
return { return {
TimePicker, TimePicker,
TimeRangePicker, TimeRangePicker,