定义新的数据结构类型
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; 未知属性 未知类型(官方叫做索引签名)
}
注意
这里的
_
只是作占位用,并不表示具体的属性名,因此可以填“任意”内容。索引签名支持 string 和 number 两种格式
如果将 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