• 就对象而言,我们可以通过属性名来访问属性值,相似的,对于一个类型对象,我们可以使用属性名来访问属性类型成员的类型

    索引类型查询

  • keyof关键字

    1. interface Person {
    2. name: string;
    3. age: number;
    4. }
    5. type K1 = keyof Person; // "name" | "age"
    6. type K2 = keyof Person[]; // "length" | "toString" | "pop" | "push" | "concat" | "join"
    7. type K3 = keyof { [x: string]: Person }; // string | number

    ```typescript interface StringArray { // 字符串索引 -> keyof StringArray => string | number

} interface StringArray1 { // 数字索引 -> keyof StringArray1 => number

}

  1. <a name="Gk5aD"></a>
  2. ## 联合类型
  3. ```typescript
  4. type Bar = { a: string, b: string };
  5. type Foo = { b: string, c: string };
  6. type Baz = keyof (Bar | Foo)
  7. // { b: string }

交叉类型

  1. type Bar = { a: string, b: string };
  2. type Foo = { c: string, d: string };
  3. type Baz = keyof (Bar & Foo)
  4. // 'a' | 'b' | 'c' | 'd'

索引类型访问

  1. interface Foo {
  2. a: true,
  3. [prop: number]: boolean
  4. }
  5. type fA = Foo[0]; // true
  6. type fB = Foo[1]; // boolean
  7. interface Bar {
  8. a: true,
  9. [prop: string]: boolean
  10. }
  11. type bA = Bar['a']; // true
  12. type bB = Bar['b']; // boolean

应用

  1. function f1<T, U extends keyof T>(obj: T, key: U): T[U] {
  2. return obj[key]
  3. }
  4. // 类型“"b"”的参数不能赋给类型“"x"”的参数
  5. f1({ x: 'zs' }, 'b')