共同点
-
都能描述函数、对象的类型信息
-
允许彼此/互相继承
-
type & type
type IPerson = { name: string; } type IStudent = IPerson & { age: number; } // type:不允许重复定义,所以不会进行合并 let obj: IStudent = { name: 'lily', age: 19 } -
type & interface
interface IPerson { name: string; } type IStudent = IPerson & { age: number; } // type:不允许重复定义,所以不会进行合并 let obj: IStudent = { name: 'lily', age: 19 } -
interface & interface
interface IPerson { name: string; } interface IStudent extends IPerson { age: number; } // type:不允许重复定义,所以不会进行合并 let obj: IStudent = { name: 'lily', age: 19 } -
interface & interface
interface IPerson { name: string; } interface IStudent extends IPerson { age: number; } // type:不允许重复定义,所以不会进行合并 let obj: IStudent = { name: 'lily', age: 19 }
-
-
type、interface 交集和并集
typetype IPerson = { name: string; age: number; } type IStudent = { age: number; count: number; } // 交集 let obj: IStudent | IPerson = { name: 'lily', age: 19 } // 并集 let obj2: IStudent & IPerson = { name: 'lily', age: 19, count: 10 }interfaceinterface IPerson { name: string; age: number; } interface IStudent { age: number; count: number; } // 交集 let obj: IStudent | IPerson = { name: 'lily', age: 19 } // 并集 let obj2: IStudent & IPerson = { name: 'lily', age: 19, count: 10 }
不同点
- interface重复定义会合并,type不会
interface IPerson { name: string; } interface IPerson { age: number; } // IPerson被合并了 let obj: IPerson = { name: 'lily', age: 19 } - type不允许重复定义,直接报错,所以没有合并
- type可以定义
类型别名与字符串字面量类型,interface不可以type TName = string; // 类型别名 type IPerson = { name: TName; } let student: IPerson = { name: 'lily' }; // 字符串字面量类型 type TCode = '1' | '2' | '5'; const str: TCode = '1';// 合法 const str2: TCode = '9'; // 非法