#reactjs #typescript
#reactjs #typescript
Вопрос:
В настоящее время я расширяю средство выбора даты пользовательского интерфейса материала и задавался вопросом, как сделать требуемые реквизиты необязательными (поскольку значения по умолчанию предоставляются родительским компонентом).
Мой текущий код:
import React, { useState } from "react";
import {
MuiPickersUtilsProvider,
DatePicker,
DatePickerProps as MuiDatePickerProps,
} from "@material-ui/pickers";
type MyDatePickerProps = {
value?: string | Date;
onChange?: (
date: MaterialUiPickersDate,
value?: string | null | undefined
) => void;
};
function MuiDatePicker(props: MuiDatePickerProps): JSX.Element {
<DatePicker
value={props.value}
onChange={props.onChange}
clearable={props.clearable}
format={props.format}
disableFuture={props.disableFuture}
disablePast={props.disablePast}
allowKeyboardControl={props.allowKeyboardControl}
openTo={props.openTo}
views={props.views}
className={props.className}
/>;
}
export default function MyDatePicker({
allowKeyboardControl = true,
clearable = false,
disableFuture = false,
disablePast = false,
format = "dd.MM.yyyy",
keyboardInputDatePicker = false,
label = "keyboard",
locale = LOCALE_DEFAULT,
value = new Date(),
...rest
}: MuiDatePickerProps amp; MyDatePickerProps) {
const handleDateChange = (date: MaterialUiPickersDate) => {
setDateValue(date);
};
return (
<MuiPickersUtilsProvider utils={DateFnsUtils} locale={LOCALE_MAP[locale]}>
<DatePicker
allowKeyboardControl={allowKeyboardControl}
className={className}
clearable={clearable}
disableFuture={disableFuture}
disablePast={disablePast}
format={format}
openTo={openTo}
onChange={handleDateChange}
value={dateValue}
views={views}
/>
</MuiPickersUtilsProvider>
);
}
Когда я пытаюсь использовать свой компонент (без установки onChange
and value
, я получаю сообщение об ошибке Type '{}' is missing the following properties from type 'BasePickerProps': value, onChange
Комментарии:
1. не могли бы вы предоставить минимальный воспроизводимый пример?
2. Вы действительно просто ищете что-то вроде
Partial<T>
? Или я неправильно понимаю?3. @jcalz спасибо за предложение, не могу поверить, что я его упустил!
4. Вы также можете использовать Omit<BasePickerProps, keyof MyDatePickerProps>, чтобы удалить реквизиты, которые обрабатываются в другом месте. Вам понадобится это вместо просто частичного<BasePickerProps> в случае, если вы включаете prop с тем же ключом, но другим типом значения.
Ответ №1:
Похоже, вы решили эту проблему, но вот обобщенное решение вашего вопроса. Я сталкиваюсь со случаем, когда я хочу сделать определенные свойства настолько необязательными, что я создал для него псевдоним:
export type PartialSome<T, U extends keyof T> = Partial<T> amp; Omit<T, U>
Этот сопоставленный тип изменяет тип или интерфейс T таким образом, что любые ключи, назначаемые U, становятся необязательными, в то время как все остальные ключи остаются неизменными (они могут быть необязательными или обязательными).
Partial<T>
делает все необязательным, в то время как объединение с Omit<T, U>
возвращает все, кроме необязательных ключей, к исходному типу.