Обложка канала

Заметки про React

Короткие и полезные заметки про React

Заметки про React

5 лет назад
Открыть в
Проблемы в типизации children Рассмотрим пример компонента:
const Card: React.FC = props => { ... }

export default function App() {
  const randomObject = {};
  return (
    <div className="App">
      <Card>{randomObject}</Card>
    </div>
  );
}
Со стороны TypeScript в данном коде нет ошибок, компонент скомпилируется. Но при запуске приложения будет ошибка со стороны React: Objects are not valid as a React child (found: object with keys {}). Проблема в том, что неверно написаны типы для React.ReactNode. Если посмотреть в исходники типов, то можно увидеть, что ReactNode расширяется от ReactFragment, который разрешает использование объекта {}.
interface ReactNodeArray extends Array<ReactNode> {}
type ReactFragment = {} | ReactNodeArray;
type ReactNode = ReactChild | ReactFragment | ReactPortal | boolean | null | undefined;
При разработке компонентов, которые принимают children, стоит учитывать ошибку в типах React. Вариант решения проблемы – создать свой тип ReactNode, который не допускает использование объекта. fettblog.eu/react-t…e-broken
TypeScript + React: Children types are broken

I currently work with a couple of newcomers to React and teach them both TypeScript and React to create apps. It’s fun, and for me who’s been using that for a while now, it’s a great way of seeing this piece of tech through fresh eyes.

fettblog.eu