2020年11月12日

ts-接口

作者 rourou

在面对对象的编程中,接口是一种规的定义,它定义了行为和动作的规范,在程序设计里面,接口起到一种限制和规范的作用。通过关键字interface实现接口。它只规定了这批类里的必须提供某些方法,提供这些方法的类可以满足实际需求。

  • 属性接口

 需要注意的是,我们传入的对象参数实际上会包含很多属性,但是编译器只会检查那些必需的属性是否存在,并且其类型是否匹配

可选属性通过?处理

可以在属性名前用 readonly来指定只读属性

interface fullName1{
  firstName:string;
  secondName?:string;
  readonly x: number;
}
function printNameq1(name:fullName1){
// 必须传入对象 firstName
  console.log(name.firstName+'--'+name.secondName)
}
// 参数的顺序可以不同
let p1: fullName1 = { x: 10, firstName:'zhangsan' };
p1.x = 5; // error!
printNameq1({firstName:'zhangsan',secondName:'lisi'})
printNameq1({firstName:'zhangsan'})

TypeScript具有ReadonlyArray<T>类型,它与Array<T>相似,只是把所有可变方法去掉了,因此可以确保数组创建后再也不能被修改:

let a: number[] = [1, 2, 3, 4];
let ro: ReadonlyArray<number> = a;
ro[0] = 12; // error!
ro.push(5); // error!
ro.length = 100; // error!
a = ro; // error!
  • 函数型接口

对方法传入的参数以及返回值进行约束

interface encrypt{
  (key:string):string
}

var md5:encrypt = function(key:string):string{
  return key;
}

md5('123');
  • 可索引接口

数组、对象的约束(不常用)

// 数组的约束
interface user{
  [index:number]:string
}
var arr:user = ['aaa','bbb'];
// 对象的约束
interface obj{
  [index:string]:string;
}
var arrObj:obj = {name:'aaa'};
  • 类类型接口

对类的约束和抽象类像时,通过关键字implements实现类接口

interface Animal{
  name:string;
  eat(str:string):void;
}
class Dogs implements Animals{
  name:string;
  constructor(name:string){
    this.name = name;
  }
  eat(str:string){
    console.log('aa')
  }
}
var d = new Dogs('黑狗');
  • 接口的扩展

接口可以继承接口。通过extends关键字

interface Animal1{
  eat():void;
}
interface Pr extends Animals{
  work():void;
}
class a{
  name:string;
  constructor(name:string){
    this.name = name;
  }
  change(){

  }
}
class W extends a implements Pr{
  constructor(name:string){
    super(name);
  }
  work(){}
  eat(){}
}
var aChange = new W('a');