在 React Native 中配置 Type Script(一)

前言:
js是弱類型的語言, 沒有類型校驗.以下是我用js開發(fā)的時候遇到的比較痛苦的場景:
編譯時看上去一切很完美,運行時可能會有莫名其妙的bug, 最后排查半天可能發(fā)現(xiàn)一個單詞拼錯了.
所以為了避免這種浪費時間的情況發(fā)生,我還是決定使用ts來做rn的開發(fā)

一睬愤、準備工作

#install brew
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

#install node & watchman
brew install node
brew install watchman

#install react native cli
npm install -g yarn react-native-cli

二逼龟、創(chuàng)建React Native項目

#init react native project & start up
react-native init RNDemo
cd RNDemo
npm start

分別啟動iOS和Android模擬器府蛇,如下圖:


Screen Shot 2018-03-27 at 3.47.27 PM.png

到這一步,basic 的react native project就弄好了

三戈盈、配置Type Script

#install type script
npm install typescript tslint rimraf concurrently --save-dev
npm install @types/react @types/react-native @types/jest --save-dev

新建tsconfig.json臣淤,并將以下內(nèi)容復(fù)制到tsconfig.json中

{
  "compilerOptions": {
    "target": "es2015",
    "module": "es2015",
    "moduleResolution": "node",
    "jsx": "react",
    "outDir": "build",
    "rootDir": "src",
    "allowSyntheticDefaultImports": true,
    "noImplicitAny": false,
    "preserveConstEnums": true,
    "allowJs": false,
    "sourceMap": true,
    "noImplicitReturns": true,
    "noUnusedParameters": true,
    "noUnusedLocals": true
  },
  "filesGlob": [
    "typings/index.d.ts",
    "src/**/*.ts",
    "src/**/*.tsx"
  ],
  "types": [
    "react",
    "react-native",
    "jest"
  ],
  "exclude": [
    "android",
    "ios",
    "build",
    "node_modules"
  ],
  "compileOnSave": false
}

四她紫、配置tslint

新建tslint.json嗅钻,并將以下內(nèi)容復(fù)制到tslint.json中

{
  "rules": {
    "member-access": false,
    "member-ordering": [
        true,
        "public-before-private",
        "static-before-instance",
        "variables-before-functions"
    ],
    "no-any": false,
    "no-inferrable-types": [false],
    "no-internal-module": true,
    "no-var-requires": true,
    "typedef": [false],
    "typedef-whitespace": [
      true, {
        "call-signature": "nospace",
        "index-signature": "nospace",
        "parameter": "nospace",
        "property-declaration": "nospace",
        "variable-declaration": "nospace"
      }, {
        "call-signature": "space",
        "index-signature": "space",
        "parameter": "space",
        "property-declaration": "space",
        "variable-declaration": "space"
      }
    ],
    "ban": false,
    "curly": false,
    "forin": true,
    "label-position": true,
    "no-arg": true,
    "no-bitwise": true,
    "no-conditional-assignment": true,
    "no-console": [
      true,
      "debug",
      "info",
      "time",
      "timeEnd",
      "trace"
    ],
    "no-construct": true,
    "no-debugger": true,
    "no-duplicate-variable": true,
    "no-empty": true,
    "no-eval": true,
    "no-null-keyword": true,
    "no-shadowed-variable": true,
    "no-string-literal": true,
    "no-switch-case-fall-through": true,
    "no-unused-expression": true,
    "no-use-before-declare": true,
    "no-var-keyword": true,
    "radix": true,
    "switch-default": true,
    "triple-equals": [
      true,
      "allow-undefined-check"
    ],
    "eofline": false,
    "indent": [
      true,
      "spaces"
    ],
    "max-line-length": [
      true,
      150
    ],
    "no-require-imports": false,
    "no-trailing-whitespace": true,
    "object-literal-sort-keys": false,
    "trailing-comma": [
      true, {
        "multiline": "never",
        "singleline": "never"
      }
    ],
    "align": [true],
    "class-name": true,
    "comment-format": [
      true,
      "check-space"
    ],
    "interface-name": [false],
    "jsdoc-format": true,
    "no-consecutive-blank-lines": [true],
    "no-parameter-properties": false,
    "one-line": [
      true,
      "check-open-brace",
      "check-catch",
      "check-else",
      "check-finally",
      "check-whitespace"
    ],
    "quotemark": [
      true,
      "single",
      "avoid-escape"
    ],
    "semicolon": [
      true,
      "never"
    ],
    "variable-name": [
      true,
      "check-format",
      "allow-leading-underscore",
      "ban-keywords"
    ],
    "whitespace": [
      true,
      "check-branch",
      "check-decl",
      "check-operator",
      "check-separator",
      "check-type"
    ]
  }
}
// use tslint-config-prettier
// {
//   "extends": ["tslint-react", "tslint-config-prettier"],
//   "rules": {
//     "max-line-length": [true, 120]
//   },
//   "linterOptions": {
//     "exclude": ["config/**/*.js", "node_modules/**/*.ts"]
//   }
// }

五、配置npm快捷腳本
在package.json中添加以下腳本

 "scripts": {
    "test": "jest",
    "lint": "tslint src/**/*.ts",
    "tsc": "tsc",
    "clean": "rimraf ./build",
    "build": "npm run clean && npm run tsc --",
    "watch": "npm run build -- -w",
    "start0": "node node_modules/react-native/local-cli/cli.js start",
    "start": "npm run build && concurrently -r 'npm run watch' 'npm run start0'"
  }

六鹊奖、驗證

接下來驗證type script 是否已經(jīng)能正常work

mkdir src
touch TestComp.ts
#TestComp.ts
export function helloWorld() {
  return 'Hello World'
}

修改App.js

import { helloWorld } from './src/ts_components/TestComp'
...
export default class App extends Component {
  render() {
    return (
      <View style={styles.container}>
        <Text style={styles.welcome}>
          {helloWorld()}
        </Text>
        <Text style={styles.instructions}>
          To get started, edit App.js
        </Text>
        <Text style={styles.instructions}>
          {instructions}
        </Text>
      </View>
    );
  }
}
npm install
npm run start

在模擬器中查看效果:


Screen Shot 2018-03-27 at 5.16.23 PM.png

嘗試修改helloWorld function 的return value苛聘,然后使用cmd+R | double R 刷新模擬器查看效果

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市忠聚,隨后出現(xiàn)的幾起案子设哗,更是在濱河造成了極大的恐慌,老刑警劉巖两蟀,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件网梢,死亡現(xiàn)場離奇詭異,居然都是意外死亡赂毯,警方通過查閱死者的電腦和手機澎粟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來欢瞪,“玉大人活烙,你說我怎么就攤上這事∏补模” “怎么了啸盏?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長骑祟。 經(jīng)常有香客問我回懦,道長,這世上最難降的妖魔是什么次企? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任怯晕,我火速辦了婚禮,結(jié)果婚禮上缸棵,老公的妹妹穿的比我還像新娘舟茶。我一直安慰自己,他們只是感情好堵第,可當我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布吧凉。 她就那樣靜靜地躺著,像睡著了一般踏志。 火紅的嫁衣襯著肌膚如雪阀捅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天针余,我揣著相機與錄音饲鄙,去河邊找鬼凄诞。 笑死,一個胖子當著我的面吹牛忍级,可吹牛的內(nèi)容都是我干的幔摸。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼颤练,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了驱负?” 一聲冷哼從身側(cè)響起嗦玖,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎跃脊,沒想到半個月后宇挫,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡器瘪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年绘雁,在試婚紗的時候發(fā)現(xiàn)自己被綠了橡疼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片庐舟。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡欣除,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出挪略,到底是詐尸還是另有隱情历帚,我是刑警寧澤杠娱,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站摊求,受9級特大地震影響禽拔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜室叉,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一奏赘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧太惠,春花似錦、人聲如沸凿渊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至构舟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間狗超,已是汗流浹背弹澎。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工努咐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人渗稍。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像报强,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子躺涝,可洞房花燭夜當晚...
    茶點故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容

  • 2017.4.6 孩子們扼雏,晚上好!今晚想和你們聊聊怎么不把家里弄亂诗充,我知道這個對現(xiàn)在的你們而言有點難度,尤其老二你...
    來自過去的信閱讀 93評論 0 0
  • 中午蝴蜓,給媽媽打了一個電話!聊起家常!媽媽說茎匠,爸爸借了五千塊給堂哥!堂哥病著,剛蓋了房子緊巴巴的诵冒!看病還在花錢!媽媽...
    瑀軒閱讀 239評論 0 1