一、接口interface
1.1 定义
接口(Interface)是一种用于描述对象的结构的方式,用interface定义。接口定义了对象的属性和方法,但不提供实现。它们用于强制执行一种特定的对象形状。
// 定义对象声明
interface Obj {
name:string,
age:number
}
let obj:Obj = {
name:'张三',
age:12
}
// 定义函数参数声明
interface N1 {
(n: number): boolean
}
function getSum(arr: number[], callback: N1) {
let sum = 0
arr.forEach(item => {
if (callback(item)) {
sum += item
}
})
return sum
}
// 实现偶数相加
const result = getSum([1, 2, 3, 4], (n) => n % 2 === 0)
console.log(result)
1.2 重复声明
interface接口可以重复声明,并进行类型合并,类似于交叉声明
interface N1 {
name: string
}
interface N1 {
age: number
}
let n1: N1 = {
name: '张三',
age: 121
}
1.3 继承
interface接口可以通过extends进行类型继承
interface N1 {
name: string
}
interface N2 extends N1 {
age: number
}
let n1: N2 = {
name: '张三',
age: 121
}
1.4 子接口不能覆盖父接口的成员
interface N1 {
name: string
}
interface N2 extends N1 { // 报错
name: number
}
二、类型别名
类型别名(Type Aliases)用于为一个类型定义一个新的名字,用type定义。通过类型别名,你可以更容易地引用复杂的类型结构,提高代码的可读性和可维护性
type Person {
name:string,
age:number
}
类型别名不能重复定义,会报错
type T1 = {
name: string
}
type T1 = {
age: number
}
类型别名可以通过联合声明/交叉声明进行拓展
type T1 = {
name: string
}
// 交叉声明 将两个类型进行合并
type T2 = {
age: number
} & T1
// 联合声明,两个类型可以任用一个
type T3 = {
gender: string
} | T2
let t2: T3 = {
gender: 'a'
}
三、总结
- type是给类型定义一个别名,方便使用
- interface是定义描述一个对象
- type和interface都可以定义对象类型,但type可以定义基本类型
- type无法重复定义,会报错,interface可以重复声明,会进行类型合并
- interface可以重复声明,但重复声明的时候,如果声明了重复的属性,属性类型不能冲突
- inteface可以通过extends进行继承,type只能通过交叉类型实现类似的继承
- interface子类型不能覆盖父类型的属性
- interface可以用于类约束,type不行
- interface可以继承于类,表示接口要拥有类的成员