@@ -257,7 +257,7 @@ export type DatePickerProps = OmitUnion<
257257 ) => void ;
258258 }
259259 | {
260- selectsRange : true ;
260+ selectsRange ? : true ;
261261 selectsMultiple ?: false | undefined ;
262262 formatMultipleDates ?: never ;
263263 onChange ?: (
@@ -269,7 +269,7 @@ export type DatePickerProps = OmitUnion<
269269 }
270270 | {
271271 selectsRange ?: false | undefined ;
272- selectsMultiple : true ;
272+ selectsMultiple ? : true ;
273273 formatMultipleDates ?: (
274274 dates : Date [ ] ,
275275 formatDate : ( date : Date ) => string ,
@@ -283,6 +283,22 @@ export type DatePickerProps = OmitUnion<
283283 }
284284 ) ;
285285
286+ // Internal types for onChange handlers - used for type assertions within the component
287+ type OnChangeSingle = (
288+ date : Date | null ,
289+ event ?: React . MouseEvent < HTMLElement > | React . KeyboardEvent < HTMLElement > ,
290+ ) => void ;
291+
292+ type OnChangeRange = (
293+ date : [ Date | null , Date | null ] ,
294+ event ?: React . MouseEvent < HTMLElement > | React . KeyboardEvent < HTMLElement > ,
295+ ) => void ;
296+
297+ type OnChangeMultiple = (
298+ dates : Date [ ] | null ,
299+ event ?: React . MouseEvent < HTMLElement > | React . KeyboardEvent < HTMLElement > ,
300+ ) => void ;
301+
286302interface DatePickerState {
287303 open : boolean ;
288304 wasHidden : boolean ;
@@ -953,38 +969,40 @@ export class DatePicker extends Component<DatePickerProps, DatePickerState> {
953969 }
954970
955971 if ( selectsRange ) {
972+ const onChangeRange = onChange as OnChangeRange | undefined ;
956973 const noRanges = ! startDate && ! endDate ;
957974 const hasStartRange = startDate && ! endDate ;
958975 const hasOnlyEndRange = ! startDate && ! ! endDate ;
959976 const isRangeFilled = startDate && endDate ;
960977 if ( noRanges ) {
961- onChange ?.( [ changedDate , null ] , event ) ;
978+ onChangeRange ?.( [ changedDate , null ] , event ) ;
962979 } else if ( hasStartRange ) {
963980 if ( changedDate === null ) {
964- onChange ?.( [ null , null ] , event ) ;
981+ onChangeRange ?.( [ null , null ] , event ) ;
965982 } else if ( isDateBefore ( changedDate , startDate ) ) {
966983 if ( swapRange ) {
967- onChange ?.( [ changedDate , startDate ] , event ) ;
984+ onChangeRange ?.( [ changedDate , startDate ] , event ) ;
968985 } else {
969- onChange ?.( [ changedDate , null ] , event ) ;
986+ onChangeRange ?.( [ changedDate , null ] , event ) ;
970987 }
971988 } else {
972- onChange ?.( [ startDate , changedDate ] , event ) ;
989+ onChangeRange ?.( [ startDate , changedDate ] , event ) ;
973990 }
974991 } else if ( hasOnlyEndRange ) {
975992 if ( changedDate && isDateBefore ( changedDate , endDate ) ) {
976- onChange ?.( [ changedDate , endDate ] , event ) ;
993+ onChangeRange ?.( [ changedDate , endDate ] , event ) ;
977994 } else {
978- onChange ?.( [ changedDate , null ] , event ) ;
995+ onChangeRange ?.( [ changedDate , null ] , event ) ;
979996 }
980997 }
981998 if ( isRangeFilled ) {
982- onChange ?.( [ changedDate , null ] , event ) ;
999+ onChangeRange ?.( [ changedDate , null ] , event ) ;
9831000 }
9841001 } else if ( selectsMultiple ) {
1002+ const onChangeMultiple = onChange as OnChangeMultiple | undefined ;
9851003 if ( changedDate !== null ) {
9861004 if ( ! selectedDates ?. length ) {
987- onChange ?.( [ changedDate ] , event ) ;
1005+ onChangeMultiple ?.( [ changedDate ] , event ) ;
9881006 } else {
9891007 const isChangedDateAlreadySelected = selectedDates . some (
9901008 ( selectedDate ) => isSameDay ( selectedDate , changedDate ) ,
@@ -995,14 +1013,14 @@ export class DatePicker extends Component<DatePickerProps, DatePickerState> {
9951013 ( selectedDate ) => ! isSameDay ( selectedDate , changedDate ) ,
9961014 ) ;
9971015
998- onChange ?.( nextDates , event ) ;
1016+ onChangeMultiple ?.( nextDates , event ) ;
9991017 } else {
1000- onChange ?.( [ ...selectedDates , changedDate ] , event ) ;
1018+ onChangeMultiple ?.( [ ...selectedDates , changedDate ] , event ) ;
10011019 }
10021020 }
10031021 }
10041022 } else {
1005- onChange ?.( changedDate , event ) ;
1023+ ( onChange as OnChangeSingle | undefined ) ?.( changedDate , event ) ;
10061024 }
10071025 }
10081026
@@ -1058,6 +1076,7 @@ export class DatePicker extends Component<DatePickerProps, DatePickerState> {
10581076 const { selectsRange, startDate, endDate, onChange, timeZone } = this . props ;
10591077
10601078 if ( selectsRange ) {
1079+ const onChangeRange = onChange as OnChangeRange | undefined ;
10611080 // In range mode, apply time to the appropriate date
10621081 // If modifyDateType is specified, use that to determine which date to modify
10631082 // Otherwise, use the legacy behavior:
@@ -1078,7 +1097,7 @@ export class DatePicker extends Component<DatePickerProps, DatePickerState> {
10781097 if ( timeZone ) {
10791098 changedStartDate = fromZonedTime ( changedStartDate , timeZone ) ;
10801099 }
1081- onChange ?.(
1100+ onChangeRange ?.(
10821101 [
10831102 changedStartDate ,
10841103 endDate
@@ -1104,7 +1123,7 @@ export class DatePicker extends Component<DatePickerProps, DatePickerState> {
11041123 if ( timeZone ) {
11051124 changedEndDate = fromZonedTime ( changedEndDate , timeZone ) ;
11061125 }
1107- onChange ?.(
1126+ onChangeRange ?.(
11081127 [
11091128 startDate
11101129 ? timeZone
@@ -1133,7 +1152,7 @@ export class DatePicker extends Component<DatePickerProps, DatePickerState> {
11331152 if ( timeZone ) {
11341153 changedStartDate = fromZonedTime ( changedStartDate , timeZone ) ;
11351154 }
1136- onChange ?.( [ changedStartDate , null ] , undefined ) ;
1155+ onChangeRange ?.( [ changedStartDate , null ] , undefined ) ;
11371156 } else if ( startDate && endDate ) {
11381157 // Apply time to endDate
11391158 let changedEndDate = setTime ( endDate , {
@@ -1147,7 +1166,7 @@ export class DatePicker extends Component<DatePickerProps, DatePickerState> {
11471166 if ( timeZone ) {
11481167 changedEndDate = fromZonedTime ( changedEndDate , timeZone ) ;
11491168 }
1150- onChange ?.(
1169+ onChangeRange ?.(
11511170 [
11521171 timeZone ? fromZonedTime ( startDate , timeZone ) : startDate ,
11531172 changedEndDate ,
@@ -1186,7 +1205,7 @@ export class DatePicker extends Component<DatePickerProps, DatePickerState> {
11861205 changedDate = fromZonedTime ( changedDate , timeZone ) ;
11871206 }
11881207
1189- this . props . onChange ?.( changedDate ) ;
1208+ ( this . props . onChange as OnChangeSingle | undefined ) ?.( changedDate ) ;
11901209 }
11911210
11921211 if ( this . props . shouldCloseOnSelect && ! this . props . showTimeInput ) {
@@ -1255,7 +1274,7 @@ export class DatePicker extends Component<DatePickerProps, DatePickerState> {
12551274 minute : getMinutes ( newTime ) ,
12561275 } ) ;
12571276
1258- this . props . onChange ?.( changedDate ) ;
1277+ ( this . props . onChange as OnChangeSingle | undefined ) ?.( changedDate ) ;
12591278
12601279 if ( this . props . showTimeSelectOnly || this . props . showTimeSelect ) {
12611280 this . setState ( { isRenderAriaLiveMessage : true } ) ;
@@ -1652,9 +1671,9 @@ export class DatePicker extends Component<DatePickerProps, DatePickerState> {
16521671
16531672 const { selectsRange, onChange } = this . props ;
16541673 if ( selectsRange ) {
1655- onChange ?.( [ null , null ] , event ) ;
1674+ ( onChange as OnChangeRange | undefined ) ?.( [ null , null ] , event ) ;
16561675 } else {
1657- onChange ?.( null , event ) ;
1676+ ( onChange as OnChangeSingle | undefined ) ?.( null , event ) ;
16581677 }
16591678
16601679 this . setState ( { inputValue : null } ) ;
0 commit comments