儘管TypeScript聲稱自己是JavaScript的超集,只是如果單純把TypeScript作為包含型別限定的JavaScript來使用,我們會在使用過程中遇到一些可能難以理解的報錯,今天我來整理一下我在使用TypeScript中遇到的問題以及解決方案。
1. 第三方依賴匯入報錯
有很多時候我們需要在專案中使用一些npm庫,目前一些流行的npm庫都有自帶的型別定義檔案,但是如果是早期的第三方依賴或者是個人開發不是特別流行的npm庫,可能並不會有對應的型別定義,針對於一些早期的npm庫,開發者可能會推出對應的@types補充包,例如我們可以使用 npm install @types/node
來進行型別補充,這樣就可以避免typescript型別檢查報錯。如果對於一些並不流行的第三方依賴,沒有對應的@types/庫名,那麼我們需要在typings.d.ts檔案中進行型別宣告:
// typings.d.ts declare module '庫名' { // 在這裏新增模組的型別宣告 }
如果上述方法不能解決問題,那麼只能使用最終的必殺技:any大法
import * as 庫名 from '庫名'; const instance: any = new 庫名();
作為一個傷敵一千,自損八百的招數,any可以解決90%的型別儲存,但是這樣也就失去了ts的型別檢查,作為實在沒有辦法在使用的解決方案。
2. 函式入參型別不匹配
有時候在我們呼叫方法時,typescript型別檢查會提示出入參型別不匹配,這時候有兩種常見的策略來解決這個問題,第一種方法可以使用強制型別轉化
(arrayList as Array).slice(2,5) (changeStudentsToArray(students as Students) as Array).sort((a,b)=> a.age - b.age)
第二種方法可以使用型別繼承或者型別擴充套件
type RealType = { [key: string]: unknown } & NeedType //或者使用介面 interface RealType extends NeedType { [key: symbol]: unknown }
3. 在單例模式中為單例新增屬性
例如說在專案中寫了一個帶樣式的控制檯輸出,並且在生產環境下自動遮蔽log級別的日誌,我想要把這個log方法掛載到window物件上
window.log=Log //型別“Window & typeof globalThis”上不存在屬性“log”。
此時,可以使用全域性的型別定義
declare global { interface Window { log: (...args: any[]) => void; } } Window.prototype.log = function (...args: any[]): void { console.log(...args); };
這樣,就可以直接在專案中使用log方法了。
ok,以上是今天總結的一些typescript報錯,和修復方法,後續遇到了新的報錯,會及時在文章裡更新。