切換語言為:簡體

TypeScript報錯彙總&解決方案

  • 爱糖宝
  • 2024-09-08
  • 2052
  • 0
  • 0

儘管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報錯,和修復方法,後續遇到了新的報錯,會及時在文章裡更新。

0則評論

您的電子郵件等資訊不會被公開,以下所有項目均必填

OK! You can skip this field.