索引类型查询操作符 keyof 可以获取操作数的可访问索引字符串字面量类型。
代码实例如下:[typescript] 纯文本查看 复制代码interface Antzone{
webName:string;
age:number;
address:string;
}
let type:keyof Antzone;
返回值是已存在的公共属性名构成的字符串联合类型,截图如下:
这时候,字符串索引就形成字符串字面量类型,并且这些字面量类型组合成一个联合类型。
关于字符串字面量类型可以参阅TypeScript 字符串字面量类型一章节。
使用索引类型,编译器就可以检查使用动态属性名的代码。
代码实例如下:[typescript] 纯文本查看 复制代码function func(obj, names) {
return names.map(name =>obj[name]);
}
上面代码可以返回对象属性子集的属性值数组。
在TypeScript通过索引类型查询和索引访问操作符实现类似功能。
代码如下:[typescript] 纯文本查看 复制代码interface Antzone{
webName:string;
age:number;
address:string;
}
function func(obj: T, names: K[]): T[K][] {
return names.map(name => obj[name]);
}
let antzone: Antzone = {
webName: '蚂蚁部落',
age: 5,
address:"青岛市南区"
};
let strings = func(antzone, ['webName','age']);
使用keyof T可以动态获取索引类型,也就是如果接口新增一个属性,它会实时获取。
于是可以很方便的检查是否传递了正确的属性名给函数。
代码实例如下:[typescript] 纯文本查看 复制代码let strings = func(antzone, ['webName','target']);
代码报错,因为并没有target属性;实现此判定利用了泛型限定,具体参阅TypeScript 泛型限定一章节。
函数的返回值类型是T[K]类型数组,关于T[K]索引访问操作符参阅TypeScript keyof 用法一章节后半部分。
看如下代码实例,以加深对T[K]的理解:[typescript] 纯文本查看 复制代码interface Antzone{
webName:string;
age:number;
address:string;
}
let antzone: Antzone = {
webName: '蚂蚁部落',
age: 5,
address:"青岛市南区"
};
type tp=Antzone["webName"];
let webName=antzone["webName"];
上面代码中,T是接口Antzone,K是字符串索引,如"webNmae",返回值是对应属性的数据类型,也就是antzone对象的webName属性值的数据类型。