到目前為止,我們的例子其實都預期使用者從頭到尾都使用.ts檔,也就是純TypeScript來開發,但現實中這是不太可能的,像我的例子就是開發到一半,才覺得應該要開始使用TypeScript。也有可能你需要匯入其它舊專案的helper來使用也說不定。那...怎麼摻在一起咧?
我們先假設你的tsconfig.json裡面只有這些東西:
{
"compilerOptions": {
"target": "ES2020",
"outDir": "./dist",
"rootDir": "./src"
}
}
這時,請在src資料夾中創立兩個檔案,一個是helper.js
,另一個是index.ts
。
並讓我們先在helper.js
裡面寫點東西:
const echo = (message) => {
console.log(message)
}
export const calculateTax = (price) => {
echo(price*1.02, true)
}
這是一個滿常見的檔案內容,我們把一些helper function寫在同一支檔案,方便之後匯入專案內任何需要的角落,進行後續使用。
那,讓我們匯進index.ts
來使用吧,請在index.ts
裡面寫下這些內容:
import { calculateTax } from "./helper.js"
calculateTax(100)
讓我們進行編譯吧,執行tsc
,你會發現我們可以順利編譯沒有問題!目前還都在預料內。
接著,讓我們執行看看編譯後的檔案
> node dist/index.js
接著就會看到精采的錯誤了!
Error [ERR_MODULE_NOT_FOUND]: Cannot find module //後面是路徑名
那這是為什麼呢?
是因為TypeScript並不會幫你處理副檔名為.js
的檔案,所以就不會幫你將檔案從src複製到dist目錄當中,可想而知,要執行時當然找不到helper.js
這檔案(./dist
裡面還真的沒看到helper.js
)。
解決方法很簡單:我們在tsconfig.json
中加入下面資訊即可:
{
"compilerOptions": {
"target": "ES2020",
"outDir": "./dist",
"rootDir": "./src",
"allowJs": true //加入這行,允許.js檔被TypeScript給處理
}
}
加入後我們再執行一次tsc
,就能看到helper.js
出現在./dist
目錄內囉。
雖然現在我們能順利讓.js
出現在./dist
了,但...不知道你有沒有發現,我們的.js
內部型別都沒被檢查到呢。
想要讓TypeScript也幫我們檢查.js
,我們可以在tsconfig.json裡面再加一行:
{
"compilerOptions": {
//略
"allowJs": true,
"checkJs": true
}
}
加完後,我們再執行一次tsc
,或者在執行前,你就已經能看到helper.js
有報出錯誤了,超讚。
src/helper.js:6:22 - error TS2554: Expected 0-1 arguments, but got 2.
6 echo(price * 1.02, true)
這是因為,echo
這個函式其實只期待使用者帶入零到一個引數,但熟知JavaScript的人都會知道,我們想要塞幾個引數給echo
,在純JavaScript裡面是都不會報錯的。而TypeScript並不這麼覺得,所以在編譯前就跟你說他覺得這邊怪怪的。
那有趣的事情來了,要是我們因為某種因素,沒有權力更改helper.js
,或者說他是來自第三方的函式庫,改起來不確定會發生什麼事怎麼辦?這時我們可以在.js
的檔案開頭,加上註解,來讓TypeScript決定要不要檢查這個檔案。讓我們於檔案開頭加上以下內容:
//@ts-nocheck //這邊是真的要以註解的形式加上去唷,不然.js絕對認不出來ts-nocheck是什麼
//下略
加上去以後,你就會發現原本的錯誤消失了(安靜了)。當我們加上這行後,就算你在tsconfig.json內有特別註記要checkJs,它也會直接"不檢查"有寫這行的這個檔案。
相對的,也有一個註解叫做//@ts-check
,就算我們在tsconfig.json內有加上"checkJs": false
,他也會強制的檢查該檔案。
加完了,讓我們再一次執行tsc
吧,執行後很自然的,./dist
就生成了兩個應該有的檔案,那讓我們執行看看:
> node dist/index.js
//102
完全沒有錯誤的執行了這個程式碼!這樣我們就順利的在TypeScript中加入了原生JavaScript檔案了!
儘管如此,TypeScript在檢查.js時的行為,跟檢查.ts檔案是有諸多不同的,我們這邊就不一一細講了,有興趣了解差異的朋友可以到以下官方文件進行閱讀
https://www.typescriptlang.org/docs/handbook/type-checking-javascript-files.html