在ts中我们用**接口**来定义对象的类型(Interfaces)
接口一方面用于对对象的**形状进行描述
另一方面对类的一部分行为进行抽象**
这里我们对第一个场景进行讨论:
                           在**
确定属性**的情况下 我们在创建对象变量时,比接口少了一些属性或多一些属性都是不允许的。
可选属性
任意属性
一个接口中只能定义一个任意属性。
interface Person {
name: string;
age: number;
[propName: string]: any; // [propName: string]定义了任意属性取 string 类型的值。
}
需要注意的是,一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它的类型的**子集**,看一个例子:
interface Person {
name: string;
age?: number;
[propName: string]: string;
}
let tom: Person = {
name: 'Tom',
age: 25,
gender: 'male'
};
// Property 'age' of type 'number' is not assignable to string index type 'string'.
报错 age的类型number不是任意属性的类型string的子集
补救:
- 将任意属性的类型改为 确定属性 和 可选属性 的父集 比如说 any
- 采用联合类型的方式 去满足 接口中有多个类型的属性 上面的例子改为:
[propName: string]: string | number;
只读属性
报错信息:用 readonly 定义的属性 id 初始化后,又被赋值了,所以报错了。
同时要注意 这里的初始化 时对该对象的初始化 而不是对该属性,见下面的例子: