React JSX¶
Бесплатная серия видео на YouTube о лучших React / TypeScript практиках
PRO Egghead курс по TypeScript и React
Настройка¶
Наше краткое руководство по браузеру уже позволяет вам разрабатывать react приложения. Вот важные моменты:
- Используйте файлы с расширением
.tsx
(вместо.ts
). - Используйте
"jsx": "react"
вcompilerOptions
вашего конфигаtsconfig.json
. - Установите определения для JSX и React в свой проект: (
npm i -D @types/react @types/react-dom
). - Импортируйте react в ваши
.tsx
файлы (import * as React from "react"
).
HTML теги против Components¶
React может отображать либо HTML-теги (строки) либо компоненты React. Итоговый код JavaScript для этих элементов отличается (React.createElement('div')
против React.createElement(MyComponent)
). Это определяется регистром первой буквы. foo
распознаётся как тег HTML, а Foo
как компонент.
Проверка типа¶
HTML теги¶
HTML-тег foo
должен иметь тип JSX.IntrinsicElements.foo
. Эти типы уже определены для всех основных тегов в файле react-jsx.d.ts
, который вы установили. Вот пример содержимого файла:
1 2 3 4 5 6 7 8 9 10 |
|
Функциональные компоненты¶
Вы можете определить функциональные компоненты просто с помощью React.FunctionComponent
интерфейса, например:
1 2 3 4 5 6 7 8 9 10 |
|
Классовые компоненты¶
Компоненты проверяются по типу на основе свойства компонента props
. Это формируется после того, как JSX преобразуется, т. е. атрибуты становятся свойствами
компонента.
Файл react.d.ts
определяет React.Component<Props,State>
класс, который вы должны расширить в своем собственном классе, предоставляя свои собственные Props
и State
интерфейсы. Это показано ниже:
1 2 3 4 5 6 7 8 9 10 |
|
React JSX совет: интерфейс для рендеринга¶
React может рендерить несколько вещей, например JSX
или string
. Все они объединены в тип React.ReactNode
, поэтому используйте его, когда вы хотите принимать рендеримые объекты, например:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
React JSX cовет: принять экземпляр Component¶
В react определениях типов есть React.ReactElement<T>
, чтобы вы могли описывать результат создания экземпляра компонента класса <T/>
. Например:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
Конечно, вы можете использовать это для описания параметра функции и даже как свойство компонента React.
React JSX совет: принять компонент, который может воздействовать на свойства и рендериться с помощью JSX¶
Тип React.Component<Props>
объединяет React.ComponentClass<P> | React.StatelessComponent<P>
так что вы можете принять что-то, что требует типы Props
и отрендерить его с помощью JSX, например:
1 2 3 4 |
|
React JSX совет: обобщённые компоненты¶
Работает именно так, как ожидалось. Вот пример:
1 2 3 4 5 6 7 8 9 |
|
Обобщённые функции¶
Что-то вроде следующего отлично работает:
1 2 3 |
|
Однако использование обобщённой стрелочной функции приведет к:
1 |
|
Решение: используйте extends
чтобы сказать компилятору, что это обобщённый параметр, например:
1 |
|
React JSX совет: строго типизированные refs¶
Вы в основном инициализируете переменную как объединение ref и null
, а затем инициализируете ее как колбэк, например:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
И то же самое с ref для собственных элементов, например.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
Утверждения типа¶
Используйте синтаксис as Foo
для утверждений типов, как мы упоминали ранее.
Свойства по умолчанию¶
- Stateful компоненты со свойствами по умолчанию: Вы можете сообщить TypeScript, что свойство будет предоставлено извне (посредством React), используя оператор null assertion (это не идеальный вариант, но это простейшее решение с минимальным дополнительным кодом, которое я смог придумать).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
- Функциональные stateless компоненты со свойствами по умолчанию: рекомендуется использовать простые шаблоны JavaScript, поскольку они хорошо работают с системой типов TypeScript, например:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
Объявление веб-компонента¶
Если вы используете веб-компонент, определения типа React по умолчанию (@types/react
) не будут знать об этом. Но вы можете легко сказать об этом, например чтобы объявить веб-компонент под названием my-awesome-slider
, который принимает Props MyAwesomeSliderProps
, вы должны:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
Теперь вы можете использовать его в TSX:
1 |
|