iT邦幫忙

2022 iThome 鐵人賽

DAY 18
0
自我挑戰組

你也對開始使用typescript感到無力嗎?我也是 - 30天初探typescript系列 第 18

第18天!TypeScript檔內要怎麼引入JavaScript?

  • 分享至 

  • xImage
  •  

到目前為止,我們的例子其實都預期使用者從頭到尾都使用.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


上一篇
第17天!TypeScript 與 DOM的應用!
下一篇
第19天!函式多載(function overloads)
系列文
你也對開始使用typescript感到無力嗎?我也是 - 30天初探typescript30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言