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