typescript学习笔记其二 | 青训营

62 阅读3分钟

三、接口

什么是接口

接口定义

接口是对传入参数进行约束;或者对类里面的属性和方法进行声明和约束,实现这个接口的类必须实现该接口里面属性和方法;typescript中的接口用interface关键字定义。

在面向对象语言中,接口(Interfaces)是一个很重要的概念,它是对行为的抽象,而具体如何行动需要由类(classes)去实现(implement)。 TypeScript 中的接口是一个非常灵活的概念,除了可用于对类的一部分行为进行抽象以外,也常用于对「对象的形状(Shape)」进行描述。

接口作用

接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部状态数据,也不关心这些类里方法的实现细节,它只规定这批类里必须提供某些方法,提供这些方法的类就可以满足实际需要。typescrip中的接口类似于java,同时还增加了更灵活的接口类型,包括属性、函数、可索引和类等。

让我们继续扩展这个示例应用。这里我们使用接口来描述一个拥有 firstName 和 lastName 字段的对象。 在 TypeScript 里,只在两个类型内部的结构兼容,那么这两个类型就是兼容的。 这就允许我们在实现接口时候只要保证包含了接口要求的结构就可以,而不必明确地使用 implements 语句。

实践案例

interface Person {
  name: string
  age: number
}

let tom: Person = {
  name: 'Tom',
  age: 25
}

上面的例子中,我们定义了一个接口 Person,接着定义了一个变量 tom,它的类型是 Person。这样,我们就约束了 tom 的形状必须和接口 Person 一致。 接口一般首字母大写。有的编程语言中会建议接口的名称加上 I 前缀。 定义的变量比接口少了一些属性是不允许的,多一些属性也是不允许的,可见, 赋值的时候,变量的形状必须和接口的形状保持一致。

有时我们希望不要完全匹配一个形状,那么可以用可选属性,但这时仍然不允许添加未定义的属性。

有时候我们希望一个接口允许有任意的属性,使用 [propName: string] 定义了任意属性取 string 类型的值。 需要注意的是,一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它的类型的子集。

有时候我们希望对象中的一些字段只能在创建的时候被赋值,那么可以用 readonly 定义只读属性,注意,只读的约束存在于第一次给对象赋值的时候,而不是第一次给只读属性赋值的时候。

属性接口对传入对象的约束,也就是json数据。

函数类型的接口对方法传入的参数和返回值进行约束。

可索引的接口对索引和传入的参数的约束。

接口继承

实践案例:

//父类Anmal看上面
//实现LaoHu的这个接口,必须也要实现LaoHu继承的Anmal接口中的方法
interface LaoHu extends Anmal{
say (sa : string) : void
}
//继承并实现接口
class XiaoLaoHu implements LaoHu{
name : string
constructor (name : string) {
    this.name = name
}
eat (food : string) : void {
    console.log(`${this.name}${food}`)
}
say(sa: string): void {
    console.log(`${this.name}${sa}`)
}
}

const xiao : XiaoLaoHu = new XiaoLaoHu('老虎捏')
xiao.eat('饭')
xiao.say('你好')