就对象而言,我们可以通过属性名来访问属性值,相似的,对于一个类型对象,我们可以使用属性名来访问属性类型成员的类型
索引类型查询
keyof关键字
interface Person {name: string;age: number;}type K1 = keyof Person; // "name" | "age"type K2 = keyof Person[]; // "length" | "toString" | "pop" | "push" | "concat" | "join"type K3 = keyof { [x: string]: Person }; // string | number
```typescript interface StringArray { // 字符串索引 -> keyof StringArray => string | number
} interface StringArray1 { // 数字索引 -> keyof StringArray1 => number
}
<a name="Gk5aD"></a>## 联合类型```typescripttype Bar = { a: string, b: string };type Foo = { b: string, c: string };type Baz = keyof (Bar | Foo)// { b: string }
交叉类型
type Bar = { a: string, b: string };type Foo = { c: string, d: string };type Baz = keyof (Bar & Foo)// 'a' | 'b' | 'c' | 'd'
索引类型访问
interface Foo {a: true,[prop: number]: boolean}type fA = Foo[0]; // truetype fB = Foo[1]; // booleaninterface Bar {a: true,[prop: string]: boolean}type bA = Bar['a']; // truetype bB = Bar['b']; // boolean
应用
function f1<T, U extends keyof T>(obj: T, key: U): T[U] {return obj[key]}// 类型“"b"”的参数不能赋给类型“"x"”的参数f1({ x: 'zs' }, 'b')
