typescript中的interface理解
1.简单理解interface
interface
是一种自定义的类型检测规范
可以通过定义interface
来作为对象型参数的类型检测
比如定义一个User
类型的检测规范
interface User{
name:string,
age:number,
email?:string//?将email标记为可选属性
}
在使用User
进行类型检测的时候
必须传入满足User
的对象属性
//比如下面这个函数,返回值必须得符合User的规范
//说明返回的对象必须为{name:"",age:0}或者{name:"",age:0,email:""}这样的类型
function setUser(usename:string,age:number,email?:string):User{
return { name: username, age, email}
}
输出
console.log(setUser("测试name",age:12))
//{ name: '测试name', age: 12, email: undefined }
2.interface的拓展
可以通过extends
来在interface
中加入其他interface
的规范
interface A{
nameA:string
}
interface B{
nameB:string
}
interface C extends A,B{
nameC:string
}
此时interface c extends a,b{ nameC:string }
就相当于
interface C{
nameA:string,
nameB:string,
nameC:string
}
使用C来进行检测时就得按照interface C
的规范
const obj:C = {
nameA:"这是A",
nameB:"这是B",
nameC:"这是C"
}
console.log(obj)
//{ nameA: '这是A', nameB: '这是B', nameC: '这是C' }
3.接口的实现类
用类来实现interface
的时候,使用关键字implements
来实现
需要把interface
作为类最小实现规范,也就是类至少必须要实现interface
的内容
类在满足interface
的情况下也可以加其他的内容
下面的IUser
接口,实现类至少需要实现getName()
和getAge()
,才满足接口的规范
interface IUser{
getName():string,
getAge():number
}
定义实现类AdminUser
class AdminUser implements IUser{
private name:string
private age:number
constructor(adminName:string,adminAge:number){
this.name=adminName
this.age=adminAge
}
getName():string{//这个方法必须要有,且满足IUser的规范
return this.name
}
getAge(): number {//这个方法必须要有,且满足IUser的规范
return this.age
}
setName(newName:string):void{
this.name = newName
}
}
用类创建对象
const admin = new AdminUser("管理员A",12)
admin.setName("管理员newName")
console.log(admin.getName())
// 管理员newName
补充
1.多态:一个类可以实现多个接口,一个接口也可以拓展多个接口的规范
2.索引签名: 只规范接口中属性的类型,不规范属性的名字时候
interface testIndex { [key:string]: string; // 属性名为字符串,属性值也为字符串,但是不强制要求具体的属性名 } const obj:testIndex={ myKey:"这是我的Key" } console.log(obj) // { myKey: '这是我的Key' }