TS使用接口(Interfaces)来定义对象的类型,约束内容需要符合的形状;
简单例子:
1.普通接口:变量的内容需要和接口中的参数保持完全一致,不能多参数也不能少参数;
interface Person {
name: string,
age: number,
}
let tom: Person = {
name: 'string',
age: 0,
}
2.可选属性:可比接口参数少,但比接口不能多;
interface Person {
name: string, // 必备参数
age?: number, // 为可以选参数,可少
}
let tom: Person = {
name: 'string',
}
3.任意属性:接口中允许存在任意属性;
// 注意:任意属性定义后,必须属性/可选属性为任意属性子类型;
interface Person {
name: string,
age?: number,
[propName: string]: any // string / number 是any的子类型;
}
let tom: Person = {
name: 'string',
abc: 'abc',
}
// 报错情况为下:
interface Person {
name: string,
age?: number, // 报错:number不是string的字类型
[propName: string]: string
}
let tom: Person = {
name: 'string',
age: 20,
abc: 'abc',
}
// 使用联合类型解决如下:只能TS.json配置文件为"strict": false时才不会报错;
interface Person {
name: string,
age?: number, // strict为true时还是会报错;
[propName: string]: string | number
}
let tom: Person = {
name: 'string',
age: 20,
abc: 'abc',
}
4.只读属性:只能在创建的时候被赋值;
// 约束在于第一次给 对象 赋值时,而不是第一次个只读属性赋值时;
interface Person {
readonly id: number,
name: string,
age?: number,
[propName: string]: any,
}
let tom: Person = { // 报错,因为第一次创建的时候未包含id参数;
name: 'string',
age: 20,
abc: 'abc',
}
tom.id = 1; // 报错,因为上面已经创建了tom,其id为之读属性,后续不允许再修改;