Загрузка…
Загрузка…
TypeScript · middle · сложность 4
children обычно типизируют как ReactNode — самый широкий тип: JSX, строки, числа, массивы, null. Композиция — собирать UI, вкладывая компоненты друг в друга, а не раздувать «бог-компонент» десятками пропсов.
В <Card>Hello</Card> содержимое между тегами приходит как children. Контейнер задаёт рамку, потребитель — содержимое.
ReactNode: почти всегда для children.ReactElement: только JSX-элемент; строка уже не подойдёт.string: только текст, если реально обрабатываете как строку.ReactNode (например icon).Композиция убирает «20 пропсов на все случаи»: один контейнер, разный контент снаружи.
import type { ReactNode, ReactElement } from "react";
// Container component: provides the frame, doesn't decide the content
type CardProps = {
title: string; // text only: we use it as-is
icon?: ReactNode; // a component passed via props
children: ReactNode; // anything renderable
};
function Card({ title, icon, children }: CardProps) {
return (
<section className="card">
<header>{icon}<h2>{title}</h2></header>
<div className="card-body">{children}</div>
</section>
);
}
// ReactElement: here we require JSX, a string won't compile
function Modal({ content }: { content: ReactElement }) {
return <div className="modal">{content}</div>;
}
// Usage: the same container works for very different content
// <Card title="Profile" icon={<span aria-hidden>*</span>}>
// <p>Name: Ana</p>
// </Card>
// <Card title="Notice">Just some plain text</Card>
// <Modal content={<p>Confirm action</p>} />
// <Modal content="hello" />
// Error: Type 'string' is not assignable to type 'ReactElement'Слишком узкий тип children:
type CardProps = { children: string }; // too restrictive
// <Card><p>Hello</p></Card>
// Error: Type 'Element' is not assignable to type 'string'Со string нельзя передать JSX; с одним ReactElement — неудобно с текстом и несколькими детьми. Дефолт — ReactNode:
import type { ReactNode } from "react";
type CardProps = { children: ReactNode }; // accepts text, JSX, arrays, null...
// Mental rule: for children, ReactNode is the default choiceДля children по умолчанию берите ReactNode; композиция через children чище, чем гигантский список пропсов.