如何在TypeScript使用模塊化以及注意事項詳解
前言
隨著我們的代碼越來越龐大,我們需要拆分模塊組合, 便于后續(xù)的維護
除了commonJS, es6. ts也是支持模塊化的!???
如何在TS中寫es6模塊化語句
自從發(fā)布ES6(ES2015)之后, ts就采用了es6的模塊化標(biāo)準(zhǔn)-導(dǎo)出和導(dǎo)入模塊??
- 寫法:
導(dǎo)出:
myModule.ts
export const name: number = 123
export const getUser = (user: string): void => {
console.log(user)
}導(dǎo)入:
index.ts
import { name, getUser } from "./myModule";
getUser(name)- 值得注意的是TS的智能提示發(fā)揮到了超乎想象??
沒有引入直接使用變量, 波浪線智能提示從哪里引入

直接書寫變量,enter直接帶出引入


??雖智能, 但還是要注意幾點
| 注意事項 | 詳細(xì) |
|---|---|
| 獲取智能提示有條件 | 但是要注意的是: 這個提示只適用于export, 不適用于export default。因為export有固定的變量名,而export default導(dǎo)出沒有名字和引入時隨意起名字, TS不會去猜測 |
import引入的文件名 | import引入的文件名不能帶上.ts, 因為會參與編譯的過程, 編譯后的結(jié)果為js,找不到ts這個文件 |
如何在TS中寫commonjs模塊化語句
按我們之前的寫法,是這樣子寫的
// 導(dǎo)出
module.exports = {
sum (a: number, b: numnber) {
return a + b
}
}
//引入
const mymodule = require('./xxx')此時會發(fā)現(xiàn)mymodule的類型為any,沒有類型檢查了
- 在
ts中這樣才能有完整的類型檢查, 并且和上述寫法的編譯結(jié)果一樣
// 導(dǎo)出
exports = {
sum (a: number, b: numnber) {
return a + b
}
}
//引入
import mymodule = require('./xxx')會發(fā)現(xiàn)寫法還是有差異的,
所以建議還是使用es6的標(biāo)準(zhǔn)會比較好,因為ta是后面的標(biāo)準(zhǔn)
解決導(dǎo)入錯誤的情況
先看一個例子,我們在代碼里引入node中的fs模塊
ts文件中:
import fs from "fs";
fs.readFileSync('./')編譯結(jié)果:
// tsconfig.json中設(shè)置module: CommonJs, 結(jié)果如下
exports.__esModule = true;
var fs_1 = require("fs");
fs_1["default"].readFileSync('./');??此時會發(fā)現(xiàn)一些問題
- 1.在ts文件中書寫會報錯
- 2.編譯結(jié)果中, 使用了default屬性
.readFileSync
編譯后的fs沒有default屬性, 所以報錯了
為什么會報錯呢
import fs from "fs";
fs不是標(biāo)準(zhǔn)esmodule標(biāo)準(zhǔn)導(dǎo)出 因為fs默認(rèn)使用module.exports={}的形式導(dǎo)出, import直接引入, 編譯結(jié)果會帶上default, fs中沒有default屬性
解決方案
- ??1.解構(gòu)出方法使用, 這樣就不會使用
default屬性
ts文件中:
import { readFileSync } from "fs";
readFileSync('./')編譯結(jié)果:
exports.__esModule = true;
var fs_1 = require("fs");
(0, fs_1.readFileSync)('./');- ??2.使用
* as fs全部導(dǎo)入, 將module.exports內(nèi)全部導(dǎo)入
ts文件中:
import * as fs from "fs";
fs.readFileSync('./')編譯結(jié)果:
exports.__esModule = true;
var fs = require("fs");
fs.readFileSync('./');- ??3.設(shè)置
esModuleInterop為true, 讓TS識別出是否導(dǎo)出esmudole標(biāo)準(zhǔn)形式,并作出相應(yīng)的處理
tsconfig.json
{
"compilerOptions": {
// 啟用es模塊化交互而非es模塊導(dǎo)出
"esModuleInterop": true
}
}ts文件中:
import fs from "fs";
fs.readFileSync('./')編譯結(jié)果:
// 生成輔助函數(shù)__importDefault
// 此時如果不是屬于esmodule形式導(dǎo)出, ts會默認(rèn)添加default屬性,值設(shè)置為本身
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模塊標(biāo)準(zhǔn)要早
這種語法對于創(chuàng)建復(fù)雜的定義文件有很多有用的功能,并且在DefinitelyTyped中仍然被積極使用。雖然沒有被廢棄,但命名空間中的大部分功能都存在于ES Modules中,官方建議使用它來與JavaScript的方向保持一致
總結(jié)
到此這篇關(guān)于如何在TypeScript使用模塊化以及注意事項的文章就介紹到這了,更多相關(guān)TypeScript使用模塊化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用 JavaScript 進(jìn)行函數(shù)式編程 (一) 翻譯
本文是函數(shù)式編程系列的第一篇文章。這里我會簡要介紹一下編程范式,然后會直接介紹使用 Javascript 進(jìn)行函數(shù)式編程的概念,因為 JavsScript 是最被認(rèn)可的函數(shù)式程序語言之一。我們鼓勵讀者通過參考資料部分進(jìn)一步了解這一迷人的概念2015-10-10
基于JavaScript實現(xiàn)評論框展開和隱藏功能
本文通過實例代碼給大家介紹了基于JavaScript實現(xiàn)評論框展開和隱藏功能,感興趣的朋友參考下吧2017-08-08
javascript中如何將字符串轉(zhuǎn)換成數(shù)字
這篇文章主要介紹了javascript中如何將字符串轉(zhuǎn)換成數(shù)字問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02
js實現(xiàn)用戶輸入的小寫字母自動轉(zhuǎn)大寫字母的方法
下面小編就為大家?guī)硪黄猨s實現(xiàn)用戶輸入的小寫字母自動轉(zhuǎn)大寫字母的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-01-01
JS實現(xiàn)轉(zhuǎn)動隨機數(shù)抽獎特效代碼
這篇文章主要為大家詳細(xì)介紹了一款轉(zhuǎn)動隨機數(shù)抽獎的JS特效代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2015-08-08

