Изменения типов в React 18Вышло мажорное обновление библиотеки типов для React 18 @types/react@^18.0.0. В нем есть несколько критических изменений:
- Убран неявный проп children в React.FC и React.Component. Теперь, если компонент ожидает проп children, то его нужно передавать явно:
interface Props {
children?: React.ReactNode;
}
const SomeFunctionComponent: React.FC
= props => {props.children}
Есть несколько причин, почему был удален проп children. Во первых, очень часто этот проп не использовался. Но так как он был объявлен в типах, то это могло приводить к неверным предположениям о работе компонента (раз есть проп children, то значит он как-то используется внутри компонента). Во вторых, более строгая типизация пропа children, теперь можно самостоятельно указать его тип. Более подробно про причины удаления неявного children написано здесь.
- Убран тип {} у ReactFragment. Это никогда не было правильным и в основном требовалось для взаимодействия с неявными пропом children.
- this.context по умолчанию станет unknown. Раньше по умолчанию был any. Это распространяется и на функцию useCallback, теперь, если тип не указан, то по умолчанию аргумент будет unknown.
- Удалены неиспользуемые типы. Приведены к общей терминологии, как они называются в репозитории и документации:
-StatelessComponent
+FunctionComponent
-SFC
+FC
-React.ReactType
+React.ElementType
-SFCElement
+FunctionComponentElement
// без замены
-Props
-RefForwardingComponent
-SFCFactory
https://github.com/DefinitelyTyped/DefinitelyTyped/pull/56210