从RN0.57版本开始已经可以直接支持typescript,无需任何配置。在保留根入口文件index.js的前提下,其他文件都可以直接使用.ts或.tsx后缀。但这一由babel进行的转码过程并不进行实际的类型检查,因此仍然需要编辑器和插件来共同进行类型检查
最大的区别:
- TypeScript是强类型语⾔和静态类型语⾔(需要指定类型)
- JavaScript是弱类型语⾔和动态类型语⾔(不需要指定类型)
由微软开发的自由和开源的编程语言,是JavaScript的一个严格超集,并添加了可选的静态类型和基于类的面向对象编程
npm install -g typescript
npm install -g typings
typings install npm~react --save
typings install dt~react-native --globals --save
如果已经安装了 yarn 安装如下:
yarn add tslib @types/react @types/react-native
yarn add --dev react-native-typescript-transformer typescript
-
cd 到 ReactNative 项目根文件夹下
tsc --init
-
修改 tsconfig.json 文件
如果一个目录下存在一个tsconfig.json文件,那么它意味着这个目录是TypeScript项目的根目录。 tsconfig.json文件中指定了用来编译这个项目的根文件和编译选项
务必设置"jsx":"react" 注意多余的注释可能会不兼容,需要移除
{ "compilerOptions": { "target": "es6", "allowJs": true, "jsx": "react", "outDir": "./dist", "sourceMap": true, "noImplicitAny": false }, // "files"属性 :指定一个包含相对或绝对文件路径的列表。 "include"和"exclude"属性指定一个文件glob匹配模式列表 "include": [ "typings/**/*.d.ts", "src/**/*.ts", "src/**/*.tsx" ], "exclude": [ "node_modules" ] }
-
cd 到项目根目录中新建存放 typescripe 源代码的文件夹
module.exports = {
getTransformModulePath() {
return require.resolve('react-native-typescript-transformer');
},
getSourceExts() {
return ['ts', 'tsx'];
}
}
{
"presets": ["react-native"],
"plugins": ["transform-decorators-legacy"]
}
-
入口
index.js
和App.js
的文件名请不要修改,项目根目录下新建src
文件夹 -
在
src
文件夹下新建.tsx
后缀的文件 -
.tsx
后缀的文件引用react的写法有所区别import * as React from 'react' import { Text, View } from 'react-native'; import { Component } from 'react'; export default class HelloWorld extends Component{ render() { return ( <View> <Text>Hello!</Text> <Text>Typescript</Text> </View> ); } }
-
在
App.js
中使用-
App.js
导入方式修改为如下方式import './src';
-
导入 .tsx 类型的组建
import HelloWorld from "./src/HelloWorld";
-
jsconfig.json
目录中存在文件表明该目录是JavaScript项目的根目录。该jsconfig.json文件指定根文件和JavaScript语言服务提供的功能选项
touch jsconfig.json
{
"compilerOptions": {
"allowJs": true,
"allowSyntheticDefaultImports": true,
"emitDecoratorMetadata": true
},
"exclude": [
"node_modules",
"rnApp/Tools" // 项目根目录下新建的存放RN中所用的一些工具类
]
}
{
"name": "RNProject",
"version": "0.0.1",
"private": true,
"scripts": { // 通过设置这个可以使npm调用一些命令脚本,封装一些功能
"start": "node node_modules/react-native/local-cli/cli.js start",
"test": "jest"
},
"dependencies": { // 发布后依赖的包
"@types/react": "^16.4.16",
"@types/react-native": "^0.57.4",
"react": "16.5.0",
"react-native": "0.57.2",
"react-transform-hmr": "^1.0.4",
"tslib": "^1.9.3"
},
"devDependencies": { // 开发中依赖的其它包
"babel-jest": "23.6.0",
"jest": "23.6.0",
"metro-react-native-babel-preset": "0.48.0",
"react-native-typescript-transformer": "^1.2.10",
"react-test-renderer": "16.5.0",
"typescript": "^3.1.2"
},
"jest": { // JavaScript 的单元测试框架
"preset": "react-native"
}
}
- --save参数表示将该模块写入dependencies属性,
- --save-dev表示将该模块写入devDependencies属性。
-
类型检查
npm install @types/jest --save-dev npm install @types/react --save-dev npm install @types/react-native --save-dev
-
装饰器转化核心插件
npm install babel-plugin-transform-decorators-legacy --save-dev
-
测试框架
npm install react-addons-test-utils --save-dev npm install react-native-mock --save-dev
npm uninstall @types/jest --save
npm uninstall @types/jest --save-dev
npm uninstall -s -D -O @types/jest
-
安装
react-transform-hmr
npm install react-transform-hmr --save
-
清除缓存重新启动服务
npm start --reset-cache