typescript 接口用于约束变量的类型,名称与需要验证的变量一一对应,它不会去检查属性的顺序,只要相应的属性存在并且类型也是对的就可以,可复用。它的结构是interface 接口名称 {定义规则}
。
interface Test {
price: number;
name: string;
}
let info: Test = {
price: 10,
name: "Apple"
};
function messa(arg): void {
console.log(arg); // { price: 10, name: 'Apple' }
}
messa(info);
上述 Test 接口对 info 的数据类型做了限制,名称一一对应,price 为 number 类型、name 为字符串类型。当类型定义不为可选类型和 any 时,这些在 Test 里出现的变量都必须出现在需要被检测的对象上,变量类型要对应上:
interface Test {
price: number;
name: string;
}
let info: Test = {
name: "Apple" // 不定义price或者类型不对则报错
};
如果我们不确定某属性会不会出现,或者不确定类型,则可以用可选类型和 any 类型代替:
interface Test {
price?: number;
name: string;
size: any;
}
let info: Test = {
name: "Apple",
size: "12"
};
上述的例子 price 是可选类型可有可无,size 是 any 类型,size 的值可以是任意数据类型。
如果我们并不是需要让属性的类型可选,而是让属性可选,那么我们可以使用索引签名。照上面普通写法,当我们给info
添加一个 Test 接口里没有定义的属性时就会报错:
interface Test {
price?: number;
name: string;
}
let info: Test = {
price: 10,
name: "Apple"
};
info.addData = 20; // 类型“Test”上不存在属性“addData”。
如果我们使用字符串索引签名,则可以给 info 添加没有被定义类型的属性:
interface Test {
price?: number;
name: string;
[index: string]: any;
}
let info: Test = {
price: 10,
name: "Apple"
};
info.addData = 20; // 可以被添加
索引类型描述能够通过索引得到的类型,也就是能够通过下标找到值。比如数组 A:[‘a’.‘b’]可以通过 A[0]获取’a’(字符串也可以通过索引获取值,例如 B:‘abcd’可以通过 B[0]获取’a’)。索引类型支持两种索引签名:字符串和数字:
[index:number]:number
[index:string]: