DevGang
Авторизоваться

Поэтапный переход на TypeScript во front-end разработке

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

Начальный этап: знакомство с TypeScript

Пример: допустим, есть простой JavaScript модуль utils.js с функцией сложения двух чисел.

utils.js
// utils.js
export function add(a, b) {
    return a + b;
}

Первым шагом меняем расширение файла на .ts и постепенно добавляем аннотации типов.

utils.ts
// utils.ts
export function add(a: number, b: number): number {
    return a + b;
}

Настраиваем TypeScript компилятор

Создаем файл tsconfig.json в корне проекта.

{
// Specify the target ECMAScript version for compilation
"target": "es6",

// Specify the module system
"module": "esnext",

// Output directory, where the compiled files are stored
"outDir": "./dist",

// Whether to include source map files for debugging
"sourceMap": true,

// Enable strict type checking options
"strict": true,

// Allow default imports from modules that do not set default exports
"esModuleInterop": true,

// Ignore type checking for libraries
"skipLibCheck": true,

// Ensure consistent case for file names
"forceConsistentCasingInFileNames": true,

// Which files to include for compilation
"include": [
    "src/**/*.ts",
    "src/**/*.tsx" // If TypeScript's JSX is used in the project
],

// Which files or directories are excluded from compilation
"exclude": [
    "node_modules",
    "**/*.spec.ts" // Exclude test files
]
}

Дополнительные настройки tsconfig.json

paths: Настройка путей для упрощения импорта модулей.

"paths": {
    "@components/*": ["src/components/*"]
}

baseUrl: Указание базового пути проекта для более компактных импортов (в сочетании с paths).

  "baseUrl": "./src"

resolveJsonModule: Разрешение прямого импорта JSON-файлов.

    "resolveJsonModule": true

lib: Указание используемых библиотек (ECMAScript, DOM и др.).

    "lib": ["es6", "dom"]

jsx: Настройка обработки JSX-синтаксиса.

    "jsx": "react-jsx"

Конфигурация наследования

Для сложных проектов с разными каталогами и конфигурациями, используйте параметр extends в tsconfig.json для наследования базовых настроек.

// tsconfig.app.json in a subdirectory
{
    "extends": "../tsconfig.json",
    "compilerOptions": {
    // You can override or add application-specific compilation options here
    },
    // You can add or modify include and exclude here
}

Интеграция TypeScript в процесс сборки

Включите TypeScript в процесс сборки, настроив ваш инструмент сборки (Webpack, Rollup, Parcel и др.) для обработки TypeScript файлов.

npm install --save-dev typescript ts-loader webpack webpack-cli

webpack.config.js

webpack.config.js
const path = require('path');

module.exports = {
  entry: './src/index.ts', // Your entry file, usually index.ts
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist'),
  },
  resolve: {
    extensions: ['.ts', '.tsx', '.js', '.jsx'], // Add .ts and .tsx extensions
  },
  module: {
    rules: [
      {
        test: /\.tsx?$/,
        use: 'ts-loader',
        exclude: /node_modules/, // Exclude the node_modules directory
      },
    ],
  },
  devtool: 'source-map', // Generate source map for easy debugging during development
};

Убедитесь, что в tsconfig.json вы настроили правильный outDir, соответствующий выходному каталогу Webpack:

{
  // ...
  "outDir": "./dist",
  // ...
}

Теперь вы можете начать процесс сборки, выполнив следующую команду из командной строки:

npx webpack

Webpack с ts-loader скомпилирует TypeScript код в JavaScript и сохранит результат в папке dist. Для автоматизации процесса, добавьте следующий скрипт в package.json:

{
  "scripts": {
    "build": "webpack"
  }
}

Запустите сборку командой npm run build.

Использование определений типов

Для использования сторонних библиотек, установите соответствующие пакеты определения типов (например, @types/lodash). Если определения отсутствуют, используйте общедоступные варианты или создайте собственные.

Установка пакетов определения типов

Установка, например, для Lodash:

npm install --save-dev @types/lodash

Или используйте Yarn:

yarn add --dev @types/lodash

Автоматический вывод типа

После установки, TypeScript автоматически определит и использует типы из установленных пакетов. Импорт в код не требуется — просто используйте библиотеку как обычно.

Определения пользовательских типов

Для библиотек без полных или отсутствующих определений типов, создайте собственные файлы объявлений (.d.ts), размещая их рядом с файлом библиотеки (например, customLib.js и customLib.d.ts), или в папке types или @types.

declare module 'customLib' {
    export function doSomething(data: string): void;
    export interface CustomInterface {
     property: number;
    }
}

TypeScript теперь распознает и использует эти типы в вашем коде.

Определения типов сообществ

Неофициальные определения типов часто доступны в репозитории DefinitelyTyped ([https://github.com/DefinitelyTyped/DefinitelyTyped](https://github.com/DefinitelyTyped/DefinitelyTyped)) или через поиск @types/library-name на GitHub.

Ограничения определений типов

Полные и точные определения типов не всегда доступны. В таких случаях может потребоваться использование any или комментария // @ts-ignore для игнорирования проверок типов.

Интеграция с IDE

Установите плагин TypeScript в вашей IDE (например, VSCode) для автодополнения, проверки типов и других функций.

Постепенный переход других модулей

Переводите модули JavaScript в TypeScript постепенно. Например, переименуйте app.js в app.ts и добавьте аннотации типов к переменным, параметрам функций и возвращаемым значениям, чтобы обеспечить проверку типов и уменьшить ошибки.

// JavaScript
function fetchData(url) {
    return fetch(url).then(response => response.json());
}

// Convert to TypeScript
async function fetchData(url: string): Promise<any> {
const response = await fetch(url);
return response.json();
}

В сложных структурах данных используйте интерфейсы (interface) или псевдонимы типов (type alias) для повышения читаемости и удобства сопровождения кода.

interface User {
    id: number;
    name: string;
    email: string;
}

function getUser(): User {
// ...
}

Усиление проверки типов

Постепенно ужесточайте проверку типов в tsconfig.json (например, включив strictNullChecks) по мере освоения TypeScript командой.

Источник:

#JavaScript #TypeScript
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

В этом месте могла бы быть ваша реклама

Разместить рекламу