在 TypeScript 中,它的介面概念其實跟 Java 或 CSharp 差不多,我們先來看看它可以幫助我們解決什麼問題。
首先,假設我有一個 function 如下:
let calculateArea(width, length) => {
// ...
}
這個 function 看起來還不算太糟糕,但如果遇到一些更複雜的狀況,例如:
let calculateArea(width, length, a, b, c, d) {
// ...
}
這時候參數變多了,就會讓這個 function 變成一個很糟糕的設計,這時候我們就會想說把所有的同一概念的參數給封裝在一起,成為一個概念。以上面的例子(只有 length 和 width 那個例子),我們可以這樣做
let calculateArea(rectangle) {
// ...
}
calculateArea({
width: 10,
length: 14
})
這樣一來如果參數變多了,但他們又是同一個概念,就好像好多了。不過,這樣還是會有一個問題。如果我這樣呼叫:
calculateArea({
radius: 10,
name: "9527"
})
編譯可能會過,但執行到這裡的時候就會出錯了。所以我們可以用一個方式解決這個問題,就是我們在前面提到的加上型別,這樣編譯器就會幫我們檢查了,萬一呼叫時給錯,就不會等到直行到那行時才會知道。
let calculateArea(rectangle: { width: number, length: number }) => {
// ..
}
好,那重點來了,如果我有很多地方都會用到 { width: number, length: number }
這個概念呢?這樣每個地方都要寫一遍,就會變得很不好維護。這時候我們就可以利用 interface 來解決這個問題。
這時候我們的主角 interface 就可以登場了,它可以這樣寫:
interface Rectangle {
width: number,
length: number
}
// 我們的參數就可以用上述這個 interface 替代
let calculateArea(rectangle: Rectangle) => {
// ...
}
// 在呼叫時,也是用一樣的方式
calculateArea({
width: 12,
height: 10
})
上面那個程式碼中 Rectangle 是 interface 的名字,如果有很多地方都會用到 Rectangle,我們就可以用這個 interface 而不用在寫一堆參數名稱和型別了。