更新: create-react-app 2.1.0 版支持typescript,因此对于那些从头开始的人,您可以使用它来创建带有typescript的新应用程序,根据文档,应该使用以下命令来完成:
$ npx create-react-app my-app --typescript
对于现有项目,在更新到 2.1.0 版本后,使用以下命令将以下包添加到项目的依赖项中:
$ npm install --save typescript @types/node @types/react @types/react-dom @types/jest
然后你可以简单地将 .js 重命名为 .ts 文件。
我找到了一个将 create-react-app 从 javascript 迁移到 typescript 的解决方案,这种方式不需要弹出。
- 通过运行命令创建一个带有 typescript 的临时 react 项目
create-react-app --scripts-version=react-scripts-ts
(注意 - 需要create-react-app
全局安装)
- 在您自己的项目中 - 在
package.json
文件下删除react-scripts
react-scripts-ts
通过运行命令添加到您的项目中,yarn add react-scripts-ts
或者如果您使用的是 npm then npm install react-scripts-ts
. 或者,添加"react-scripts-ts": "2.8.0"
到 package.json。
- 从您在步骤 1 中创建的项目中复制文件:
tsconfig.json, tsconfig.test.json tslint.json
到您自己的项目
- 在自己的项目中
package.json
,根据脚本部分,将react-scripts
实例react-scripts-ts
(应该是下start
,build
,test
和eject
- 通过使用 yarn 或 npm 安装以下module来安装用于 react 的类型:
@types/node
,@types/react
和@types/react-dom
. devDependencies
如果使用 package.json ,则放入部分。
- 将
index.js
文件名更改为index.tsx
- 在您的 tsconfig.json 文件中添加以下配置:
"allowSyntheticDefaultImports": true
-了解更多信息
注意第 7 步可能需要额外的修改,这取决于您在 index.js 文件中的内容(如果它依赖于项目中的 JS module)。
现在你可以运行你的项目,它可能会工作,对于那些收到You may need an appropriate loader to handle this file type
关于 .js 文件的错误的人来说,这是因为 babel 不知道如何从 .tsx 文件加载 .js 文件。我们需要做的是改变项目配置。我发现不运行的方法eject
是使用react-app-rewired包。此包允许您配置将添加/覆盖默认项目设置的外部配置。我们要做的是使用 babel 来加载这些类型的文件。让我们继续:
react-app-rewired
使用 yarn 或 npm安装包
在您的根文件夹(所在package.json
的位置)中创建一个名为的新文件config-overrides.js
将此代码放入config-overrides
文件中:
var paths = require('react-scripts-ts/config/paths')
module.exports = function override(config) {
config.module.rules.push({
test: /\.(js|jsx)$/,
include: paths.appSrc,
loader: require.resolve('babel-loader'),
options: {
babelrc: false,
presets: [require.resolve('babel-preset-react-app')],
cacheDirectory: true,
},
})
return config
}
编辑的package.json所以start/start-js
,build
,test
,和eject
脚本使用react-APP-重新接线如图所示项目自述。例如"test": "react-app-rewired test --scripts-version react-scripts-ts --env=jsdom"
。
现在你可以开始你的项目了,问题应该解决了。根据您的项目(其他类型等),您可能需要额外的修改。
希望能帮助到你
正如评论中所建议的,可以定义:"compilerOptions": { "allowJs": true}
在您的 tsconfig.json 文件中,这样您就可以在不使用 react-app-rewired 的情况下混合使用 JS 和 TS。感谢您提到这一点!