TL;DR
Если вы хотите перейти на TypeScript, но не хотите переносить весь свой код одновременно, вы можете настроить webpack на объединение кода TypeScript и JavaScript.
Вы можете найти демо-проект здесь.
Как?
Чтобы добавить TypeScript в проект веб-пакета, вы можете выполнить следующие шаги:
Установите необходимые dev-зависимости:
npm install --save-dev @types/jest awesome-typescript-loader typescript @types/lodash
Создайте файл tsconfig.json, чтобы указать, что вы хотите перенести на ES6:
{ "compilerOptions": { "target": "es6" } }
Добавьте awesome-typescript-loader в конфигурационный файл веб-пакета и загрузите свой TypeScript сначала через транспилятор TypeScript, а затем через Babel:
module: { rules: [ { test: /\.jsx?$/, exclude: /node_modules/, use: "babel-loader" }, { test: /\.tsx?$/, exclude: /node_modules/, use: ["babel-loader", "awesome-typescript-loader" } ] }
Чтобы Babel не преобразовал синтаксис модуля ES6 в commonjs, вам необходимо обновить файл .babelrc:
{ "presets": [["es2015", { "modules": false }], "react"], "plugins": ["transform-class-properties"] }
Теперь наступает сложная часть: поддержание работы тестов Jest.
Необходима некоторая дополнительная настройка, чтобы указать Jest транспилировать TypeScript и запустить обычный JavaScript через Babel-Jest.
В свой package.json добавьте следующую конфигурацию Jest:
"jest": { "moduleFileExtensions": ["ts", "tsx", "js", "jsx"], "transform": { "^.+\\.(ts|tsx)$": "<rootDir>/preprocessor.js", "^.+\\.(js|jsx)$": "babel-jest" }, "testRegex": "(/__tests__/.*|\\.(test|spec))\\.(ts|tsx|js|jsx)$" }
Создайте файл preprocessor.js для переноса тестов TypeScript:
const tsc = require("typescript"); module.exports = { process(src, path) { if (path.endsWith(".ts") || path.endsWith(".tsx")) { return tsc.transpile(src, {}, path, []); } return src; } };
В .babelrc вам нужно добавить отдельную конфигурацию для тестовой среды, чтобы хорошо работать с Jest:
{ "presets": [["es2015", { "modules": false }], "react"], "plugins": ["transform-class-properties"], "env": { "test": { "presets": ["es2015", "react"], "plugins": ["transform-class-properties"] } } }
Теперь у вас должна быть возможность начать перенос файлов один за другим на TypeScript, не нарушая тестов или сборок.