Open
Description
索引类型( keyof & T[K ])
使用索引类型,编译器可以检查使用动态属性名的代码。
- 索引类型查询操作符:
keyof
。对任何类型T
,keyof T
为已知类型T
的属性名的联合,比如
interface Person {
name: string;
age: number;
}
let personProps:keyof Person //personProps:"name" | "age"
- 索引访问操作符:
T[K]
interface Person {
name: string;
age: number;
}
function demo<T extends object, K extends keyof T>(obj: T, names: K[]): T[K][] {
return names.map(item => obj[item])
}
let people: Person = {
name: "test",
age: 21
}
let res1 = demo(people, ["name"]) //string[] 类型
let res2 = demo(people, ["name",'age']) //(string|number)[] 类型
T[K]
表明people['name']的类型为Person['name']。
接口(interface) 和 类型别名(type)的区别
类型别名和接口用法相似,但是还是有细微区别
- 接口创建了新的名字,鼠标放上去,展示的就是接口名,别名没有创建新名称,鼠标悬停展示的是字面量。
- 类型别名不能被 extends和 implements;
类型区分&类型保护
用户自定义的类型保护
interface Bird {
fly();
layEggs();
}
interface Fish {
swim();
layEggs();
}
// 有一个变量是Bird或者Fish中的一个,如何区分?
function isFish(pet:Fish|Bird):pet is Fish{
return (<Fish>pet).swim!==undefined
}
Metadata
Metadata
Assignees
Labels
No labels