Использование TypeScript с React
Введение
TypeScript — это круто. Как и Реакт. Давайте использовать их вместе! Использование TypeScript позволяет нам пользоваться преимуществами IntelliSense, а также дает возможность дополнительно рассуждать о нашем коде. Кроме того, внедрение TypeScript не вызывает затруднений, поскольку файлы можно постепенно обновлять, не вызывая проблем в остальной части вашего проекта.
Предпосылки
Если вы хотите следовать этому руководству, вам понадобятся:
- Один сервер Ubuntu 20.04, настроенный пользователем без полномочий root с правами
sudo
и включенным брандмауэром. Вы можете сделать это, следуя руководству по начальной настройке сервера Ubuntu 20.04. - Node.js и
npm
установлены. Вы можете сделать это с помощью Apt, используя NodeSource PPA. Следуйте варианту 2 нашего руководства по установке Node.js в Ubuntu 20.04, чтобы начать работу.
Настройка вашего проекта:
Предполагая, что вы выполнили все требования и установили Node.js и npm
, начните с создания нового каталога. Здесь мы назовем его react-typescript
:
- mkdir react-typescript
Перейдите в этот каталог в терминале:
- cd react-typescript/
Затем инициализируйте новый проект npm
со значениями по умолчанию:
- npm init -y
OutputWrote to /home/sammy/react-typescript/package.json:
{
"name": "react-typescript",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}
После того, как это будет инициализировано, вы установите соответствующие зависимости React.
Установка зависимостей React
Сначала установите зависимости React react
и react-dom
:
- sudo npm install react react-dom
Затем создайте папку с именем src
:
- mkdir src
Перейдите в этот каталог src
:
- cd src/
Затем создайте файл index.html
и вставьте его в папку src
. Вы можете сделать это с помощью предпочитаемого вами текстового редактора. Здесь мы будем использовать nano
:
- nano index.html
Теперь, когда файл index.html
открыт, вы можете внести некоторые изменения и добавить следующее содержимое:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>React + TypeScript</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<div id="main"></div>
<script type="module" src="./App.tsx"></script>
</body>
</html>
Когда вы закончите, сохраните и закройте файл. Если вы используете nano
, вы можете сделать это, нажав CTRL + X
, затем Y
и ENTER
.
Мы будем использовать этот раздел, если вы предпочитаете использовать приложение Create React. Давайте сначала установим Parcel, чтобы добавить его в наш проект:
- sudo npm install parcel
Далее устанавливаем TypeScript:
- sudo npm install --location=global typescript
Затем установите типы для React и ReactDOM:
- sudo npm install @types/react @types/react-dom
После того, как все будет установлено, вернитесь в родительский каталог, используя две точки:
- cd ..
Запуск и запуск сервера разработки
Затем обновите package.json
новой задачей, которая запустит ваш сервер разработки. Вы можете сделать это, сначала создав и открыв файл в предпочитаемом вами текстовом редакторе:
- nano package.json
Открыв файл, замените существующее содержимое следующим:
{
"name": "react-typescript",
"version": "1.0.0",
"description": "An example of how to use React and TypeScript with Parcel",
"scripts": {
"dev": "parcel src/index.html"
},
"keywords": [],
"author": "Paul Halliday",
"license": "MIT"
}
Когда вы закончите, сохраните и закройте файл.
Теперь вернитесь в каталог src
:
- cd src/
Оказавшись в каталоге, создайте и откройте файл Counter.tsx
, содержащий базовый счетчик:
- nano Counter.tsx
Добавьте в файл следующее содержимое:
import * as React from 'react';
export default class Counter extends React.Component {
state = {
count: 0
};
increment = () => {
this.setState({
count: (this.state.count + 1)
});
};
decrement = () => {
this.setState({
count: (this.state.count - 1)
});
};
render () {
return (
<div>
<h1>{this.state.count}</h1>
<button onClick={this.increment}>Increment</button>
<button onClick={this.decrement}>Decrement</button>
</div>
);
}
}
Когда вы закончите, сохраните и закройте файл.
Затем создайте файл App.tsx
в предпочитаемом вами текстовом редакторе:
- nano App.tsx
Теперь, когда файл открыт, добавьте следующую информацию для загрузки счетчика:
import * as React from 'react';
import { render } from 'react-dom';
import Counter from './Counter';
render(<Counter />, document.getElementById('main'));
После добавления содержимого сохраните и закройте файл.
Затем обновите разрешения брандмауэра, чтобы разрешить трафик порта для 1234
:
- sudo ufw allow 1234
Наконец, запустите свой проект с помощью следующей команды:
- sudo npm run dev
Output
> react-typescript@1.0.0 dev
> parcel src/index.html
Server running at http://localhost:1234
✨ Built in 3.84s
Убедитесь, что все работает, перейдя по адресу http://ваш_домен_или_IP_сервер:1234
в браузере. На вашей странице должны быть следующие функции увеличения и уменьшения:
Ваш пример проекта теперь успешно запущен и работает.
Создайте приложение React и TypeScript
Если вы предпочитаете использовать из коробки.
Используйте флаг --typescript
при вызове команды create-react-app
:
Функциональные компоненты
Компоненты без состояния или функциональные компоненты могут быть определены в TypeScript как:
import * as React from 'react';
const Count: React.FunctionComponent<{
count: number;
}> = (props) => {
return <h1>{props.count}</h1>;
};
export default Count;
Мы используем React.FunctionComponent
и определяем структуру объектов наших ожидаемых реквизитов. В этом сценарии мы ожидаем, что будет передано одно свойство с именем count
, и мы определяем его в строке. Мы также можем определить это другими способами, создав интерфейс, такой как Props
:
interface Props {
count: number;
}
const Count: React.FunctionComponent<Props> = (props) => {
return <h1>{props.count}</h1>;
};
Компоненты класса
Компоненты класса могут быть определены в TypeScript аналогичным образом, как показано ниже:
import * as React from 'react';
import Count from './Count';
interface Props {}
interface State {
count: number;
};
export default class Counter extends React.Component<Props, State> {
state: State = {
count: 0
};
increment = () => {
this.setState({
count: (this.state.count + 1)
});
};
decrement = () => {
this.setState({
count: (this.state.count - 1)
});
};
render () {
return (
<div>
<Count count={this.state.count} />
<button onClick={this.increment}>Increment</button>
<button onClick={this.decrement}>Decrement</button>
</div>
);
}
}
Реквизит по умолчанию
Мы также можем определить defaultProps
в сценариях, где мы можем захотеть установить реквизиты по умолчанию. Мы можем обновить наш пример Count, чтобы отразить следующее:
import * as React from 'react';
interface Props {
count?: number;
}
export default class Count extends React.Component<Props> {
static defaultProps: Props = {
count: 10
};
render () {
return <h1>{this.props.count}</h1>;
}
}
Нам также нужно перестать передавать this.state.count
в компонент Counter
, так как это перезапишет наш реквизит по умолчанию:
render () {
return (
<div>
<Count />
<button onClick={this.increment}>Increment</button>
<button onClick={this.decrement}>Decrement</button>
</div>
)
}
Теперь у вас должен быть проект, настроенный на использование TypeScript и React, а также инструменты для создания собственных функциональных компонентов и компонентов на основе классов!