TypeScript interface and type

December 24, 2023

  • typescript
有任何問題,我能幫上忙的話都能到 github 發 issue 問我。

Preface

首先,當然是直接附上官網的 cheat sheet 啦,可以點開看大圖。

typeScript interfaces
typeScript type

Different

我自己認為兩者最大的差別在於寫法上有點不同,舉個例子如果要對 interface 做擴充跟要對 type 做擴充的寫法如下:

// interface 要使用 extends
interface Gender {
  gender: string
}

interface Age {
  age: number
}

// 可以使用, 來進行複數擴充
interface User extends Gender, Age {
  name: string
}
// type 要使用 & (intersection)
type Gender = {
  gender: string
}

type Age = {
  age: number
}

type User = Gender &
  Age & {
    name: string
  }

再舉個例子 interface 有 implements 而 type 沒有,在這點上可以把 interface 想像成是藍圖(blueprint),定義了藍圖後,你在依據自己的需求去調整函示,可以讓程式更為嚴謹。

interface Shape {
  name: string
  area(): number
}

class Circle implements Shape {
  constructor(public radius: number, public name: string) {}

  area() {
    return Math.PI * this.radius ** 2
  }
}

const circle: Shape = new Circle(5, "Circle")

儘管沒有上述範例的使用方式,type 的優點在於他的彈性及更多元的寫法,有像是 Mapped Types,Conditional Types…等,這邊我就不一一舉例,可以去看上面提供的 cheat sheet。

Utility

這邊同時也提供一下 Utility 的 官方網址。ex: Omit, Pick, Awaited…etc

Conclusion

可以參考一下 LogRocket Blog 寫的這篇文章,我個人認為寫的滿好的,cheat sheet 則是開發時可以偷看。

我自己個人習慣是能使用 interface 就能解決的就先使用 interface,如果不行再轉而使用 type 來進行處理,據說好像也是官方推薦的使用方式,不過實際上,這也滿看公司其他合作的工程師,最好是能達成共識。

基本上,我自己認為 ts 在開發上都是滿正向的,不過這邊有一點小小吐槽,就是在大型專案,ts 會導致 vscode 相當的卡頓,目前我是使用 2019 16gb ram intel 版本的 mbp 在做全端開發,或許真的要更新上去才能比較減緩卡頓,會建議最好要買到 32gb ram 會比較保險一點點,畢竟一台 mbp 這麼貴沒使用個 5-6 年以上我認為不划算 😅。


Mayvis Chen
你好,我是 Mayvis Chen
住在台北,會點前端,會點後端,熱愛分享新知及愛喝奶茶的全端打雜工程師。