大家好~~~ 今天要來介紹型別別名(Type Alias)和介面 (Interface)。當我們在撰寫複雜的資料結構時,不可能把那麼長串的型別重寫一遍又一遍吧?這時候就輪到型別別名和介面出場啦!
還記得在上一章介紹交叉型別使用的語法嗎?型別別名是TypeScript裡的一種語法,可以為既有的型別取一個新的名稱。直接拆解「型別別名」四個字的意思,直白點說,就是:「為型別訂一個別的名稱」,我知道解釋得有點爛,但大致意思大概就是這樣(抱歉)。在語法上,使用type替型別自訂一個新的名稱。常用在聯合型別、物件和基本型別上。
//使用範例:
type Example = string | number ;
//定義一個變數的狀態:
type StudentStatus = "wake up" | "sleep" | "learning" ;
//type也可以用來定義物件的狀態,限制status只能使用特定的值,,也增加了程式碼的可讀性
//定義一個物件:
type Student = {
name: string;
grade: number;
status: StudentStatus;
};
//實際應用:
const s: Student = {
name: "Judy",
grade: 2,
status: "sleep"
};
與此同時,我們也能夠用交叉型別為type擴充:
type User = {
name: string;
};
type Admin = User & { role: string; };
基本上,介面時常和型別別名搞混,介面同樣是描述一個物件該有的屬性、方法型別等等。差別在於介面主要用來描述物件結構,而型別別名可以直接表示基本型別和聯合型別,當然兩者還有其他方面的差異,等等做個表格讓大家認識認識,先專注在Interface上吧。
//使用範例:
interface Student{
name: string;
grade: number;
}
//當需要擴充時,使用extends來表示:
interface CollegeStudent extends Student{
department: string;
}
//實際應用:
const s: CollegeStudent = {
name: "Judy",
grade: 2,
department: "西班牙語系",
};
介面的宣告合併,舉例如下:
//當兩個同名的介面存在時,雙方的屬性會被合併在一個介面中
interface Student{
name: string;
}
interface Student{
grade: number;
}
//上述的兩個介面,相當於下面這個:
interface Student{
name: string;
grade: number;
}
//注意:合併介面的屬性型別,具有唯一性
interface Student{
name: string;
}
interface Student{
name: string; //重複寫上屬性是可以的,因為型別一致,TS不會報錯
grade: number;
}
//錯誤示範:
interface Student{
name: string;
}
interface Student{
name: boolean; //在同名稱的介面更改屬性的型別,會讓TS報錯,這點須多加留意
grade: number;
}
今天的介紹就到這邊,相信很多人會搞混型別別名和介面的不同,因為乍看之下,兩者根本一模模一樣樣,但在使用上還是有不小的差距,這邊也整理了表格讓大家參考:
| 型別別名(Type Alias) | 介面(Interface) | |
|---|---|---|
| 主要用途 | 用來定義基本型別、聯合型別、物件,常用來描述狀態(status) | 用來描述物件的屬性和方法 |
| 擴充方式 | 以交叉型別來擴充 | 使用extends擴充(繼承) |
| 聯合型別 | 能夠使用 | 無法使用 |
| 宣告合併 | 無法使用,宣告同名type會報錯 |
可以使用 |
| 應用 | 聯合型別、狀態定義、API回傳等 | 物件結構、需要extends或宣告合併時 |
老實說,其實這篇寫完,我也是有點霧煞煞,聽得懂歸聽得懂,但是我也是邊寫邊學,所以在這兩者的使用上,我也是拿著木棒打怪的新手,但至少能先有個概念,知道兩者能夠使用什麼、用在什麼地方,已經是踏出一小步了。明天要來介紹函式,今天就先到這邊啦~大家拜拜!