定义新的数据结构类型

interface LabelledValue {
  label: string;
  width: number;  可选类型
  [_:string]: any;  未知属性 未知类型(官方叫做索引签名)
  readonly y: number;  只读属性,只能赋值一次
}

function printLabel(labelledObj LabelledValue) {
  console.log(labelledObj.label);
}

只读属性

interface 可以定义只读属性(readonly)。

同时,typescript 也提供了一种新的数据类型:ReadonlyArrayT,此类型的数组将在定义后不能添加、修改数组元素

let a number[] = [1, 2, 3, 4];
let ro ReadonlyArraynumber = a;
ro[0] = 12; // error!
ro.push(5); // error!
ro.length = 100; // error!
a = ro; // error!

函数类型

interface 除了定义普通对象外,还能定义函数

interface SearchFunc {
  (source: string, subString: string) boolean;
}

let mySearch SearchFunc;
mySearch = function(source string, subString string) {
  let result = source.search(subString);
  return result > -1;
}

注意

这里定义的函数,参数可以少,但不能多。

如果我们的函数是不定个数参数的怎么办?typescript 提供了 ES6 spread 方案

interface Add {
  (str: string, ...args: any[]): number;
}

let add Add;
add = function (str, a, b) {
  console.log(str)
  console.log(a, b);
}

索引签名

在一开始的例子里有索引签名的例子:

interface LabelledValue {
  [_:string]: any;  未知属性 未知类型(官方叫做索引签名)
}

注意

  1. 这里的 _ 只是作占位用,并不表示具体的属性名,因此可以填“任意”内容。

  2. 索引签名支持 string 和 number 两种格式

  3. 如果将 any 改成指定格式,则显示定义的属性也需要是该指定属性,如下

    interface LabelledValue {
      [_:string]: string;  未知属性 未知类型(官方叫做索引签名)
      a: string; // correct
        b: number; // error
    }
    

类类型

接口也可以用于定义一个类的公有属性和方法

interface ClockInterface {
    currentTime: Date;
    setTime(d: Date);
}

class Clock implements ClockInterface {
    currentTime: Date;
    setTime(d: Date) {
        this.currentTime = d;
    }
    constructor(h: number, m: number) { }
}

继承接口

interface Shape {
    color: string;
}

interface PenStroke {
    penWidth: number;
}

interface Square extends Shape, PenStroke {
    sideLength: number;
}

let square = <Square>{};
square.color = "blue";
square.sideLength = 10;
square.penWidth = 5.0;

接口继承类

目前没有很理解,todo

results matching ""

    No results matching ""