1、interface 接口只能定義描述對象類型
如:
interface PersonIn {name: string;age:number;job:string;
}
// 定義函數
interface FPerson {(a: number, b:string) => void
}
2、類型別名 type則可以定義多種類型
如:
type userName = string
type isShow = boolean
type age = number | string
type lists = [string] // 聲明元組類型
type Tree<T> = {name: T} // 定義泛型
type PersonT = { // 定義對象name: string;age: number | string;job: string;
}
// 定義函數
type Fun1 = (a:string, b:number) => void
由上可見 type 可以定義基本類型別名、元組類型,type 支持聯合類型,交叉類型,對象 函數
而 interface 只能定義 對象 函數
3、interface 與 type 定義同名類型時
interface Person {age: number;
}interface Person {name: string;
}
interface 定義的 兩個Person 同名,會自動合并為
interface Person {age: number;name: string;
}
但是 type 定義 相同名稱 Person 時會 報錯
type Person = {age: number;
}
// 會報錯
type Person = {name: string;
}
4、interface 與 type 都可以繼承
interface 繼承使用的 extends
iterface PersonA {name: string;
}
interface 繼承 interface
interface PersonB extends PersonA{age: number;
}
interface 繼承 type
interface PersonB extends PersonA {job: string;
}
type 繼承, 使用的是 & 符號
type PersonA = {age: number;
}
type 繼承 type
type PersonB = PersonA & {name: string; job:string;}
type 繼承 interface
interface Person {name: string;
}
type PersonB = PersonA & Person
5、type 與 interface 檢查規則不同
type Person = {name: string;age: number;
}
// type 定義的類型別名,只要包含部分就不會報錯
const per:Person = {name: 'Andy'
}
interface 定義的接口類型,必須包含所有必選項屬性,可以沒有job類型,因job類型是可選項
interface PersonA {name: string;age: number;job?:string;
}const perB:PersonA = {name: 'Andy',age: 20
}
官網推薦我們要使用interface定義接口類型,并且interface可以滿足絕多數場景使用,并會嚴格檢查定義的描述對象是否符合接口類型,有助于提高代碼質量規范編碼,但是type的容錯率更高,對于復雜的對象,可以使用type聲明多種類型