可选属性和任意属性

默认情况下,定义的变量比接口少一些属性和多一些属性都是不允许的:

 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;
};

任意属性

关于任意属性,有些知识点,整理如下:

  1. [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. 一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它的类型的子集:
1
2
3
4
5
6
7

interface Person{
    name: string;
    age?: number;
    [propName: string]: string;
}

  1. 一个接口只能定义一个任意属性。如果接口中有多个类型的属性,则可以在任意属性中使用联合类型。