Загрузка…
Загрузка…
TypeScript · junior · сложность 3
Описываете type или interface формы props и применяете к параметру компонента. Опциональные поля — ?, дефолты — в деструктуризации. React.FC больше не рекомендуют.
Props — контракт компонента. TypeScript предупредит, если проп забыли, передали string вместо number и т.д.
ComponentNameProps.function Button({ text }: ButtonProps).?, дефолт: { color = "blue" }.onSave: (id: number) => void.React.FC устарел: раньше неявно добавлял children, с дженериками неудобен. Проще типизировать параметр напрямую.// The component's contract: what it receives and of what type
type SaveButtonProps = {
text: string; // required
id: number; // required
disabled?: boolean; // optional (may not be passed)
color?: "blue" | "red"; // optional, with limited values
onSave: (id: number) => void; // function that takes a number
};
// Default values right in the destructuring
function SaveButton({
text,
id,
disabled = false,
color = "blue",
onSave,
}: SaveButtonProps) {
return (
<button
disabled={disabled}
className={`button-${color}`}
onClick={() => onSave(id)}
>
{text}
</button>
);
}
// Correct usage
// <SaveButton text="Save" id={7} onSave={(id) => console.log(id)} />
// <SaveButton text="Save" onSave={...} />
// Error: Property 'id' is missing in type ...
// <SaveButton text="Save" id="7" onSave={...} />
// Error: Type 'string' is not assignable to type 'number'Привычка писать React.FC:
// Works, but is no longer recommended
const Button: React.FC<ButtonProps> = ({ text }) => {
return <button>{text}</button>;
};Лучше явно:
function Button({ text }: ButtonProps) {
return <button>{text}</button>;
}Тот же результат, меньше магии.
Опишите props типом/интерфейсом и повесьте на параметр функции; опциональные поля и колбэки — часть контракта, без React.FC.