Используя TypeScript с React, мы получаем отличные возможности для разработчиков по сравнению с другими фреймворками. TypeScript может быть полезен разработчикам React во многих отношениях.

TypeScript позволяет определять сложные type определения в форме интерфейсов. Это полезно, когда у вас есть сложный type, который вы хотите использовать в своем приложении, например объект, содержащий другие свойства. Это приводит к строгим проверкам, которые, в свою очередь, сокращают количество возможных ошибок, которые вы могли бы создать без него.

Ключ к TypeScript в том, что это статически типизированный скрипт. Языки программирования могут иметь статическую или динамическую типизацию; разница в том, когда происходит проверка типа. Переменные статических языков проверяются по типу, что также помогает сделать код более читабельным.

В этом посте я покажу вам, как использовать TypeScript для улучшения кода приложения React, открыв синтаксис для самодокументированного кода.

Совет: используйте Bit для совместного использования и повторного использования компонентов React между приложениями. Вы можете находить компоненты, играть с ними и устанавливать их для более быстрой сборки. Попытайся.



Начало работы с примерами

Установка

Начнем с создания простого проекта React Project с использованием create-react-app. В командном терминале введите:

$ create-react-app typescript-react
$ cd typescript-react

Эта команда создаст в вашей папке новый каталог проекта React с именем typescript-react. Давайте внесем некоторые изменения в этот проект, чтобы мы могли использовать TypeScript.

Начнем с установки пары пакетов в качестве зависимостей от этого проекта. Наряду с такими вещами, как webpack и webpack-dev-server, нам также необходимо установить пакет typescript и специальные модули TypeScript, такие как @types/react и @types/react-dom. Также нам понадобится ts-loader для webpack.

$ yarn add webpack webpack-cli webpack-dev-server typescript @types/react @types/react-dom ts-loader

Конфигурация

Откройте каталог проекта в редакторе кода, поддерживающем TypeScript (I ❤️ VS Code), и посмотрите файл package.json. Перепишите объекты scripts, как показано ниже:

"scripts": {
  "build": "webpack ./webpack.config.js",
  "start": "webpack-dev-server ./webpack.config.js --content-base ./public"
}

Здесь сценарий start использует файл webpack.config.js для запуска webpack-dev-server для разработки приложений в реальном времени и обслуживает папку ./public. Создайте этот файл в корне каталога и напишите в нем следующий код:

module.exports = {
  devtool: 'inline-source-map',
  entry: './src/app.tsx',
  output: {
    path __dirname + '/public',
    filename: 'build/app.js'
  },
  resolve: {
    extensions: ['.ts', '.tsx', '.js']
  },
  module: {
    rules: [
      {test: /\.tsx?$/, loader: 'ts-loader'}
    ]
  }
}

Здесь inline-source-map используется для отладки файлов TypeScript в браузере. ./src/app.tsx указан как точка входа. Я также указал место для сборки пакета внутри объекта output. Нам также необходимо сообщить webpack, что он должен поддерживать все файлы с расширением .ts, .tsx или .js. Наконец, нам нужно указать webpack использовать ts-loader для .tsи .tsx файлов.

Внутри папки public удалите все, кроме файла index.html. Перепишите код внутри этого файла, как показано ниже:

<!DOCTYPE html>
  <html lang="en">
    <body>
      <div id="root"></div>
      <script src="./build/app.js"></script>
      </body>
  </html>

В этом коде есть простой div с id «root», в котором мы будем отображать приложение React, а затем загружаем пакет, созданный веб-пакетом.

Затем давайте напишем некоторую конфигурацию для TypeScript. Создайте tsconfig.jsonfile в корне каталога и напишите внутри него следующий код:

{
  "compilerOptions": {
    "sourceMap": true,
    "module": "commonjs",
    "target": "es5",
    "jsx": "react"
  },
  "include": [
  "src"
  ],
  "compileOnSave": false
}

sourceMaps включен для отладки файлов TypeScript в браузере. Нам также нужно сообщить TypeScript, что мы используем commonjs для формата модуля, ориентированного на es5. Но самый важный фрагмент кода здесь - тот, который сообщает jsx о необходимости преобразования в React.createElement. После этого нам нужно сообщить TypeScript, что исходный код находится внутри папки src. Отключите TypeScripts compileOnSave, потому что это будет обрабатывать веб-пакет.

Проверять

Удалите все файлы в папке src и создайте новый файл с именем app.tsx со следующим кодом внутри него:

import * as React from 'react';
import * as ReactDOM from 'react-dom';
ReactDOM.render(
  <div>Use TypeScript with React</div>,
  document.getElementById('root')
);

Запустите сценарий start, используя NPM или Yarn. Это запустит сервер разработки webpack и будет обслуживать папку public по адресу localhost:8080.

Компоненты React без сохранения состояния в TypeScript

Написать компоненты React без сохранения состояния на TypeScript просто. Откройте файл app.tsx в папке src и переместите div внутри функции render в компонент без состояния.

import * as React from 'react';
import * as ReactDOM from 'react-dom';
const App = () => <div>Use TypeScript with React</div>;
ReactDOM.render(
  <App />,
  document.getElementById('root')
);

Используя компоненты, мы можем использовать props для изменения поведения компонента. Передайте prop с именем message компоненту App и используйте его внутри тела функции.

const App = ({message}) => <div>{message}</div>;

TypeScript теперь выдаст нам ошибку о том, что необходимо предоставить свойство message. Чтобы устранить эту ошибку, перепишите функцию render следующим образом:

ReactDOM.render(
  <App message="Use TypeScript with React"/>,
  document.getElementById('root')
);

Это отлично подходит для функций без сохранения состояния. Мы можем пойти дальше и обозначить эту функцию как React.SFC. Перепишите компонент App следующим образом:

const App: React.SFC<{message: string}> = ({message}) => <div>{message}</div>;

И вы также можете взять определение встроенного типа опоры и переместить его в type:

type AppProps = {message: string}
const App: React.SFC<AppProps> = ({message}) => <div>{message}</div>;

Компоненты Stateful React с использованием TypeScript

Чтобы создать компонент с отслеживанием состояния в React, нам нужно расширить класс React.Component. Этот класс принимает два общих параметра: props и state.

Откройте файл app.tsx внутри папки src и перепишите компонент App как компонент с отслеживанием состояния, как показано ниже:

class App extends React.Component {
  render() {
    return(
      <div>Use TypeScript with React</div>
    );
  }
}
ReactDOM.render(
  <App />,
  document.getElementById('root')
);

Подобно компонентам без состояния, мы можем использовать props для изменения поведения компонента. React.Component принимает props в качестве первого аргумента:

class App extends React.Component <{
  message: string
}> {
    render() {
      return (
        <div>{this.props.message}</div>
      );
    }
}
ReactDOM.render(
  <App message="Use TypeScript with React"/>,
  document.getElementById('root')
);

Такие компоненты, которые расширяют React.Component, называются с отслеживанием состояния, потому что они могут иметь собственное внутреннее состояние. React.Component принимает второй общий аргумент, определяющий тип состояния.

class App extends React.Component <{
  message: string
}, {
  count: number,
  }> {
  constructor(props) {
    super(props);
    this.state = {
      count: 0
    }
  }
  render() {
    return(
      <div>{this.props.message}{this.state.count}</div>
    );
  }
}

Здесь я создаю состояние под названием count типа number. Затем это состояние инициализируется внутри constructor. Затем мы можем использовать это состояние в других местах, например, в методе render.

Основная причина наличия локального состояния в компоненте заключается в том, что вы можете управлять им внутри компонента. Внутри компонента App создайте новую функцию с именем increment.

increment = () => {
  this.setState({
    count: this.state.count + 1
  });
}

Вызовите эту функцию для div, который находится внутри функции render компонентов.

render() {
  return (
    <div onClick={this.increment}>{this.props.message}{this.state.count}</div>

Теперь состояние будет меняться всякий раз, когда пользователь щелкает div, отображаемый в браузере.

Заключение

В этом посте вы увидели, как можно использовать TypeScript, чтобы сделать код наших приложений React более удобным и читаемым.

  • Мы начали с изучения пакетов, необходимых для обеспечения совместимости TypeScript с React.
  • Затем вы увидели, как настроить TypeScript для приема кода React и как настроить Webpack для отображения этого кода в браузере.
  • Наконец, мы узнали, как писать простые компоненты React без сохранения состояния и с отслеживанием состояния с помощью TypeScript.

Учить больше