通过interface关键字来声明接口。

  1. interface LabelValue {
  2. label: string;
  3. }
  4. // 指定参数的类型是接口类型
  5. function print(labelObj:LabelValue){
  6. console.log(labelObj.label);
  7. }
  8. let obj = {
  9. label: 'hello',
  10. };
  11. print(obj); // hello

类型检查器不会去检查属性的顺序,只要相应的属性存在并且类型也是对的就可以。

可选属性

  1. interface People {
  2. name: string;
  3. age: number;
  4. }
  5. function print(people: People){
  6. console.log(people.name);
  7. console.log(people.age);
  8. }
  9. let p = {
  10. name: 'Tom',
  11. age: 30
  12. };
  13. print(p); // 'Tom' 30

目前是没有问题的,但是如果不传入name或者是age是报错的。需要通过?来解决。

  1. interface People {
  2. name?: string;
  3. age?: number;
  4. }
  5. function print(people: People){
  6. console.log(people.name);
  7. console.log(people.age);
  8. }
  9. let p = {};
  10. print(p); // undefine undefine

通过?是可以不传入参数的。虽然定义了,但是可以不传递。

只读属性

  1. interface Point {
  2. readonly x: number;
  3. readonly y: number;
  4. }
  5. let p1: Point = { x: 10, y: 20 };
  6. p1.x = 5; // error!

函数类型

  1. interface Search {
  2. (source: string, subString: string): boolean;
  3. }
  4. let mySearch:Search;
  5. mySearch = function(source:string, subString: string) {
  6. let result = source.search(subString);
  7. return result > -1;
  8. }

实际上类型检查只针对数据类型,不针对参数名称,所以可以修改参数名称的 src, sub 这样也是允许的。但是个人不推荐,怕搞混了。

数组类型

  1. interface StringArray {
  2. [index: number]: string
  3. }
  4. let myArr:StringArray;
  5. myArr=["str1", "str2"];
  6. console.log(myArr[1]); // str1

实现接口

  1. interface ClockInterface {
  2. currentTime: Date;
  3. setTime(d: Date);
  4. }
  5. class Clock implements ClockInterface {
  6. currentTime:Date;
  7. constructor(h: number, m: number){}
  8. setTime(d: Date) {
  9. this.currentTime = d;
  10. }
  11. }

接口定义的属性和方法,实现类中必须实现。

接口继承

  1. interface Shape {
  2. color: string;
  3. }
  4. interface Square extends Shape {
  5. size: number;
  6. }
  7. const s = <Square>{};
  8. s.color = "blue";
  9. s.size = 6000;

接口多继承

  1. interface Shape {
  2. color: string;
  3. }
  4. interface Stroke {
  5. width: number;
  6. }
  7. interface Square extends Shape, Stroke {
  8. size: number;
  9. }
  10. const s = <Square>{};
  11. s.color = "blue";
  12. s.size = 6000;
  13. s.width = 4000;

继承多个接口也是可以的。

混合类型

  1. interface Counter {
  2. interval: number;
  3. reset():void;
  4. (start: number): string;
  5. }
  6. let c: Counter;
  7. c(10);
  8. c.reset();