我们在之前讲过给变量进行类型声明,Typescript会对值所具有的结构进行类型检查。在Typescript里,接口的作用就是为这些类型命名和为你的代码或第三方代码定义契约。
之前,我们讲过给一个变量声明对象类型是这样的:
var obj : {name : string}
但是有了接口后,我们可以
interface dabao {
name : string;
age : num
}
var obj : dabao = {
name : 'cxh',
age : 12;
}
上面接口描述对象必须包含一个string类型的name属性以及一个number类型的age属性。
可选属性
接口里的属性不全都是必需的。 有些是只在某些条件下存在,或者根本不存在
interface dabao {
name : string;
age ?: number;
}
var obj : dabao = {
name : 'cxh'
}
只读属性
一些对象属性只能在对象刚刚创建的时候修改其值。 你可以在属性名前用 readonly来指定只读属性:
interface dabao {
readonly name : string;
readonly age : number;
}
var obj : dabao = {
name : 'cxh'
}
obj.name = 'xiaobao' //error
ReadonlyArray<T>
ReadonlyArray<T>类型与Array<T>相似,只是把所有可变方法去掉了,因此可以确保数组创建后再也不能被修改:
let dabao : ReadonlyArray<number> = [1,2,3];
let dabao[2] = 3 //error
let dabao.length = 10 //error
属性检查
假如我们传入
interface dabao {
name ?: string;
age ?: number
}
目的是得到可选name和age属性的对象,但是当我们定义多余的属性时,typescript会进行多余的检查,例如:
interface dabao {
name ?: string;
age ?: number;
}
let obj : dabao = {
name : 'cxh';
height : 180
}
//error 'height ' not expected in type 'dabao'
如果想要绕开检查,有两种方式:
第一
let obj = <dabao>{
name : 'cxh',
height :180
}
第二
interface dabao {
name ?: string;
age ?: number;
[propName: string] : any;
}
let obj : dabao = {
name : 'cxh',
height : 180
}
函数类型
interface dabao {
(name : string,age : number) : boolean
}
var fnc : dabao = function(name : string,age:number) : boolean{
return true
}
可索引的类型
可索引类型具有一个 索引签名,它描述了对象索引的类型,还有相应的索引返回值类型。 让我们看一个例子:
interface dabao {
[index:number] : string
}
let array: dabao;
array = ['cxh','ccc'];
上面例子里,我们定义了dabao接口,它具有索引签名。 这个索引签名表示了当用 number去索引dabao时会得到string类型的返回值。
共有支持两种索引签名:字符串和数字。 可以同时使用两种类型的索引,但是数字索引的返回值必须是字符串索引返回值类型的子类型。 这是因为当使用 number来索引时,JavaScript会将它转换成string然后再去索引对象。
例如:
interface dabao{
[index: string]: number;
length: number; // 可以,length是number类型
name: string // 错误,`name`的类型与索引类型返回值的类型不匹配
}
类实现接口
interface dabao {
setName (n: string)
}
class Dabao implements dabao {
name : string;
setTime(n : string) {
this.name = n
}
}
接口描述了类的公共部分,而不是公共和私有两部分。 它不会帮你检查类是否具有某些私有成员。
接口继承接口
interface xiaobao {
name : string;
}
interface dabao extends xiaobao {
age : number;
}
let obj = <dabao>{
name : 'cxh',
age : 18,
height : 180
}
console.log(obj)
混合类型
interface dabao {
setName(n : string);
age : number;
(height : number) : string;
}
var obj : dabao;
console.log(obj = <dabao>function(height){ return '1'+height})
console.log(obj.age = 12)
console.log(obj.setName = function(name:string) : string{return 'nihao'})
接口继承类
class Control {
private state : any;
}
interface SelectableControl extends Control {
select(): string;
}
class Button implements SelectableControl{
}
class Control {
private state : any;
}
interface SelectableControl extends Control {
select(): string;
}
class Button implements SelectableControl{
select(): string {return ''}
}