默认情况下,定义的变量比接口少一些属性和多一些属性都是不允许的:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
interface Person {
name: string;
age: number;
}
// 编译失败
let tom: Person = {
name: 'Tom',
}
// 编译失败
let tom: Person = {
name: 'Tom',
age: 25,
gender: 'male'
}
|
如果我们允许变量少一些属性,可用可选属性;如果我们允许变量多一些属性,可用任意属性:
1
2
3
4
5
6
7
|
// 可选属性
interface Person{
name: string;
age? number;
};
|
1
2
3
4
5
6
7
|
// 任意属性
interface Person{
name: string;
[propName: string]: any;
};
|
任意属性
关于任意属性,有些知识点,整理如下:
[propName: string]
写法并不是固定的,string还可能为number、symbol
一个案例是可以使用接口来描述数组:
1
2
3
4
5
6
7
|
interface NumberArray {
[index: number]: number;
}
let fibonacci: NumberArray = [1, 1, 2, 3, 5];
|
- 一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它的类型的子集:
1
2
3
4
5
6
7
|
interface Person{
name: string;
age?: number;
[propName: string]: string;
}
|
- 一个接口只能定义一个任意属性。如果接口中有多个类型的属性,则可以在任意属性中使用联合类型。