为什么需要接口
上节最后有函数/方法的参数声明,倘若有参数,如:
function func1({ x = 0, y = 0, z = 0 } : { x : number, y = .....}): xx {
xxx
}
那么就。。。
这个时候就用到了接口,接口的作用是描述结构的形态。
“总结”
如果用接口改写上述代码:
interface point2d {
x : number
y : number
}
interface point3d extends point2d {
z : number
}
function func({ x: 0, y: 0, z: 0}: point3d): string {
xxx
}
比起上面一个一个写就显得清爽了许多。另外,从例子中可以看出,接口可以通过extnds关键字扩展,扩展后不仅拥有以前的那些字段,还有新加的字段。
描述类
通过关键字implements去描述类。
interface Db {
readonly host: string
port: number
connect(username: string): void
}
class MySQL implements Db {
readonly host: string
port: number
constructor(host: string, port: number) {
this.host = host
this.port = port
}
connect(uname: string): void {
console.log(`${uname}正在连接${this.host}:${this.port}`)
}
}
此外,类的方法也可以写到接口里。
属性修饰符
位置可以在上面的例子里看到
readonly:字面意思。
private和protected:前者似有变量,只有自己内部方法可以访问,不可被继承,而protected可以被继承,可以理解成私房钱和姓氏。
public:和不写一样。
可选属性:在接口属性名后加一个问号,表示可传可不传。
interface Person {
IdCard: string
name?: string
}
let person: Person = { IdCard: 'xxxxx' } // 不报错
如果设定一接口,但是我临时想传更多的属性
可以通过:
interface Person {
IdCard: string
name?: string
[propName: string]: any
}
[]里限定里属性名的类型,括号后的any限定了属性的类型。其中propName是可以随便改的。