Skip to content

索引类型

tsx
let person = {
  name: 'musion',
  age: 35
}

function getValues(person: any, keys: string[]) {
  return keys.map((key) => person[key])
}

console.log(getValues(person, ['name', 'age'])) // ['musion', 35]
console.log(getValues(person, ['gender'])) // [undefined]

问题:访问不存在的属性 gender 时未报错

解决:索引类型查询,索引访问 操作符

tsx
function getValues<T, K extends keyof T>(person: T, keys: K[]): T[K][] {
  return keys.map((key) => person[key])
}

interface Person {
  name: string
  age: number
}

const person: Person = {
  name: 'musion',
  age: 35
}

getValues(person, ['name']) // ['musion']
getValues(person, ['gender']) // 报错:
// Argument of Type '"gender"[]' is not assignable to parameter of type '("name" | "age")[]'.
// Type "gender" is not assignable to type "name" | "age".

K[]:用于约束 传入键名

T[K][]:取 属性 为 K 的数组