Редактировать Хотя я лично согласен с таким поведением, оно не согласуется с поведением обычного компонента React ( машинопись поддерживает defaultProps
).
Я немного осматриваюсь, и кажется, что это было исправлено в @types/styled-components
, но затем было удалено из-за появления еще одной ошибки .
Примечание от сопровождающего типа:
Тем не менее, TS не устанавливает тип вновь установленного defaultProps (также называемого expando), поэтому не ожидайте, что это позволит пропустить требуемые реквизиты.Чтобы изменить тип, в тестах я добавил простую вспомогательную функцию, которая устанавливает defaultProps и возвращает измененный тип.Это только для примера.
Вот этот пример:
// example of a simple helper that sets defaultProps and update the type
type WithDefaultProps<C, D> = C & { defaultProps: D };
function withDefaultProps<C, D>(component: C, defaultProps: D): WithDefaultProps<C, D> {
(component as WithDefaultProps<C, D>).defaultProps = defaultProps;
return component as WithDefaultProps<C, D>;
}
Этот помощник решает проблему (и похож на * 1026Подход * @ TitianCernicova-Dragomir , поэтому вы должны пометить его ответ как правильный, если вы примете это как правильный обходной путь).
/* setup */
interface Props {
requiredProp: number;
}
const defaultProps: Props = {
requiredProp: 1,
};
const Component = styled.div<Props>``;
const ComponentWithDefault = withDefaultProps(Component, defaultProps);
export { Component, ComponentWithDefault };
/* usage */
import { Component, ComponentWithDefault } from './component.tsx';
const a = <Component /> // Property requiredProp is missing...
const b = <ComponentWithDefault /> // no error
Требования:
"@types/styled-components": "^4.1.12",
"typescript": "^3.2.4",
defaultProps
с styled-components работали в прошлом - если вы заинтересованы в сохранении такого поведения, я думаю, что может помочь возврат к более старой версии @ types / styled-components;Я думаю, что это 4.1.8, но я не уверен.
Оригинальный ответ
Возможно, не тот ответ, который вы ищете, но я нахожу этоповедение желательноЕсли вы уже определили определенные свойства в defaultProps
, разве это не сделает эти свойства необязательными?
Я бы сделал необязательные реквизиты по умолчанию:
interface ButtonProps {
size?: 'small' | 'medium' | 'large';
inverted?: boolean;
raised?: boolean;
}
Или оставил бы их нетронутыми, ноОберните Partial<>
, так как вы уже предоставили значение по умолчанию для всех из них
const Button = styled('button')<Partial<ButtonProps>>`...`
Еще одна вещь, которую я обычно делаю, - это сначала определить defaultProps
в переменной, чтобы я мог правильно определить ихинтерфейс:
interface Props { ... }
const defaultProps: Props = { ... }
const Component = styled.div<Props>`...`
Component.defaultProps = defaultProps