如何在TypeScript使用模塊化以及注意事項詳解
前言
隨著我們的代碼越來越龐大,我們需要拆分模塊組合, 便于后續(xù)的維護
除了commonJS
, es6
. ts也是支持模塊化的!???
如何在TS中寫es6模塊化語句
自從發(fā)布ES6(ES2015)之后, ts就采用了es6的模塊化標準-導出和導入模塊??
- 寫法:
導出:
myModule.ts export const name: number = 123 export const getUser = (user: string): void => { console.log(user) }
導入:
index.ts import { name, getUser } from "./myModule"; getUser(name)
- 值得注意的是TS的智能提示發(fā)揮到了超乎想象??
沒有引入直接使用變量, 波浪線智能提示從哪里引入
直接書寫變量,enter
直接帶出引入
??雖智能, 但還是要注意幾點
注意事項 | 詳細 |
---|---|
獲取智能提示有條件 | 但是要注意的是: 這個提示只適用于export , 不適用于export default 。因為export 有固定的變量名,而export default 導出沒有名字和引入時隨意起名字, TS 不會去猜測 |
import 引入的文件名 | import 引入的文件名不能帶上.ts , 因為會參與編譯的過程, 編譯后的結果為js,找不到ts這個文件 |
如何在TS中寫commonjs模塊化語句
按我們之前的寫法,是這樣子寫的
// 導出 module.exports = { sum (a: number, b: numnber) { return a + b } } //引入 const mymodule = require('./xxx')
此時會發(fā)現mymodule
的類型為any
,沒有類型檢查了
- 在
ts
中這樣才能有完整的類型檢查, 并且和上述寫法的編譯結果一樣
// 導出 exports = { sum (a: number, b: numnber) { return a + b } } //引入 import mymodule = require('./xxx')
會發(fā)現寫法還是有差異的,
所以建議還是使用es6的標準會比較好,因為ta是后面的標準
解決導入錯誤的情況
先看一個例子,我們在代碼里引入node中的fs模塊
ts文件中:
import fs from "fs"; fs.readFileSync('./')
編譯結果:
// tsconfig.json中設置module: CommonJs, 結果如下 exports.__esModule = true; var fs_1 = require("fs"); fs_1["default"].readFileSync('./');
??此時會發(fā)現一些問題
- 1.在ts文件中書寫會報錯
- 2.編譯結果中, 使用了default屬性
.readFileSync
編譯后的fs沒有default屬性, 所以報錯了
為什么會報錯呢
import fs from "fs";
fs不是標準esmodule標準導出 因為fs默認使用module.exports={}的形式導出, import直接引入, 編譯結果會帶上default, fs中沒有default屬性
解決方案
- ??1.解構出方法使用, 這樣就不會使用
default屬性
ts文件中:
import { readFileSync } from "fs"; readFileSync('./')
編譯結果:
exports.__esModule = true; var fs_1 = require("fs"); (0, fs_1.readFileSync)('./');
- ??2.使用
* as fs
全部導入, 將module.exports
內全部導入
ts文件中:
import * as fs from "fs"; fs.readFileSync('./')
編譯結果:
exports.__esModule = true; var fs = require("fs"); fs.readFileSync('./');
- ??3.設置
esModuleInterop
為true
, 讓TS識別出是否導出esmudole標準形式,并作出相應的處理
tsconfig.json { "compilerOptions": { // 啟用es模塊化交互而非es模塊導出 "esModuleInterop": true } }
ts文件中:
import fs from "fs"; fs.readFileSync('./')
編譯結果:
// 生成輔助函數__importDefault // 此時如果不是屬于esmodule形式導出, ts會默認添加default屬性,值設置為本身 var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; exports.__esModule = true; var fs_1 = __importDefault(require("fs")); fs_1["default"].readFileSync('./');
補充:TypeScript命名空間
TypeScript
有自己的模塊格式,稱為 命名空間(namespaces)
,這比ES
模塊標準要早
這種語法對于創(chuàng)建復雜的定義文件有很多有用的功能,并且在DefinitelyTyped
中仍然被積極使用。雖然沒有被廢棄,但命名空間中的大部分功能都存在于ES Modules
中,官方建議使用它來與JavaScript
的方向保持一致
總結
到此這篇關于如何在TypeScript使用模塊化以及注意事項的文章就介紹到這了,更多相關TypeScript使用模塊化內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!