TS中的接口

# TS中的接口

用于约束:类、对象、函数 的标准。

类似于 Type-C 、USB、Lighting 的数据接口都是要满足一些标准的。

标准的形式:

  • 文档 -> 弱标准,有可能不遵循文档协议,没有提示,只能在运行后才能知道。
  • 代码约束,强标准。

# TS 中如何使用接口

  1. 接口约束对象

    接口和类型别名一样不会出现在编译结果中

    区别就是接口可以约束类,

    interface Student {
        name: string,
        age: number
    }
    
    let stu: Student = {
        name: 'zhang san',
        age: 18
    }
    
  2. 约束函数

    // <-----!1--------->
    interface callback {
        (n: number): boolean
    }
    // <-----!2--------->
    type callback = {
        (n: number): boolean
    }
    
    function sum(source: number[], callback: callback): number {
        return source.filter(callback).reduce((prev, item) => prev + item, 0)
    }
    
    console.log(sum([1, 2, 3, 4, 5], (n) => n % 2 == 0));
    

    两种约束方式都可以

# 接口继承

可以通过接口间的继承实现多种组合(已经区分开类型别名)

子接口中不能覆盖父接口的成员。

interface Father {
    name: string,
}

interface Son extends Father {
    age: number
}

let obj: Son = {
    name: 'zhang san',
    age: 18
}

接口支持多继承

interface Father {
    name: string,
}

interface Son extends Father {
    age: number
}

interface Other extends Son, Father {
		// age:string,  无法定义,子接口无法覆盖父接口成员。
    trick: boolean
}

let obj: Other = {
    name: 'zhang san',
    age: 18,
    trick: true
}

# 交叉类型

可以通过 & 进行类型别名的交叉。

type Father = {
    name: string
}

type Son = {
    age: number
}

type Other = {
		//age:string , 可以通过,但是会将两个成员进行交叉变成, number & string 
    trick: boolean
} & Son & Father

let obj: Other = {
    name: 'zhang san',
    age: 18,
    trick: true
}

区别:

  • 子接口不能覆盖父接口的成员
  • 交叉类型会把相同成员的类型进行交叉。

# readonly (修饰符)

修饰一些类型和属性。修饰的目标是只读的。

interface Student {
    readonly stu_id: string,
    name: string,
    age: number
}

let stu: Student = {
    name: 'zhang san',
    age: 18,
    stu_id: '12138'
}