接口介绍
Typescript的核心原则之一就是对值所具有的结构进行类型检查 。 接口的作用 : 1. 接口是用来描述类型要求的,定义形状。2. 抽象类,类来实现接口。
接口初识
-
语法
interface 调用签名 { 属性名 : 类型; }注意 : 虽然接口命名后面是一个 {} 但是并不是一个对象,里面写的相当于语句,类似class的写法
-
举例
interface Lable { name : string; } let obj : Label = { name: 'bu' }注意: 这种情况表示obj有且只能有name一个属性,添加其他多余属性还是会报错。
解决:添加索引标签
interface Obj { name: string, age: number, [abc:string]:any } let obj : Obj = { name: 'buzhanhua', age: 12, s:'s' }
可选属性
接口里的属性不全都是必须的 , 当某些属性不确定什么时候存在是可以
带有可选属性的接口与普通的接口定义差不多,只是在可选属性名字定义的后面加一个?符号。
interface SquareConfig {
color?: string;
width?: number;
}
只读属性
一些对象的属性只能使用不能修改时 , 你可以在属性名前用readonly来指定只读属性
interface Point {
readonly x: number;
readonly y: Array<string>;
}
y 显然是一个引用类型,你直接更改它的引用地址的时候是会报错的,但是你直接更改它的数组项却是被允许的,你如果想你的数组项也是只读的,可以采用下面的方式
interface Foo{
readonly y : ReadonlyArray<string>
}
这样的话,对应数组的数组项也是不可改变的,而且该数组也不可赋值给别的数组
函数类型
接口可以描述JavaScript中对象拥有的各种各样的外形。除了普通对象外,接口也可以描述函数类型
-
语法
interface 调用签名 { (参数1:参数1类型,参数2 : 参数2类型,...) : 返回值类型 } -
用法
interface fn { (src : string , num : number) : boolean } let myFn : fn = function(s:string,n:number){ console.log(s,n) return n+1>0 } myFn("buzhna",2)注意
函数的参数名不需要与接口定义的名字相匹配,typescript会逐个进行检查,要求对应位置的上的参数类型是兼容的
函数的参数也可以不指定类型 , Typescript的类型系统会推断出参数类型
可索引类型
我们也可以通过接口描述那些能够“通过索引得到”的类型,比如 a[1] 或 a["1"]
可索引类型具有一个索引签名,用来描述对象索引的类型,还有相应索引返回值类型
interface StringArray {
[index: number]: string;
}
let myArray: StringArray;
myArray = ["Bob", "Fred"];
let myStr: string = myArray[0];
TypeScript支持两种索引签名:字符串和数字。 可以同时使用两种类型的索引,但是数字索引的返回值必须是字符串索引返回值类型的子类型。 这是因为当使用 number来索引时,JavaScript会将它转换成string然后再去索引对象。 也就是说用 100(一个number)去索引等同于使用"100"(一个string)去索引,因此两者需要保持一致。
接口的使用场景
类型监测
上面介绍了类型监测传递参数,和创建函数,接口还可以监测类,或者说用类实现一个接口
interface Foo{
name : string
age : number
}
class MyFoo implements Foo{
name : string = 'buzhanhua';
age : number = 16
say(){
console.log(`${this.name} 今年 ${this.age}`)
}
}
let myFoo = new MyFoo();
继承
TypeScript 是单继承的,也就是说只能使用extends 继承一个类,若是你的需求要使用两个或以上类的时候,则需要将父类当做接口进行混入mixins
另外接口是可以继承接口的,并可以多继承,使用逗号隔开
interface People{
name : string
}
interface Man extends People{
sex : string
}
interface LitterBobay {
say():void
}
interface Son extends Man ,LitterBobay {
}
let boy : Son = {
name : 'bufan',
sex : 'man',
say(){
console.log('hello')
}
}
接口和类的关系
关系如下图
class Auto {
state = 1
}
interface AutoInterface extends Auto{
}
class C implements AutoInterface{
state = 2
}
class Bus extends Auto implements AutoInterface{
}
let auto : AutoInterface = {
state:1
}