ts
let obj = {
a: 1,
b: 2,
c: 3
}
// 抽取值形成数组
function getValues(obj: any, keys: string[]) {
return keys.map(k => obj[k])
}
console.log(getValues(obj, ['a', 'b'])); // [1, 2]
console.log(getValues(obj, ['e', 'f'])); // [undefined, undefined] 属性不存在也不报错
可以使用索引来约束处理这种问题。
索引类型查询操作符:keyof T
是一种索引类型查询操作符,用于获取类型 T 的所有属性名的联合类型。它可以用于访问和操作对象类型的属性名称。
ts
interface Obj {
a: number,
b: string
}
let key: keyof Obj;
索引访问操作符:T[K]
表示类型 T 中索引为 K 的属性的类型。这种语法通常用于访问对象类型中特定属性的类型。
ts
let value: Obj['a'];
泛型约束:T extends U
ts
function getValues<T, K extends keyof T>(obj: T, keys: K[]): T[K][] {
return keys.map(k => obj[k])
}
console.log(getValues(obj, ['a', 'b'])); // [1, 2]
console.log(getValues(obj, ['e', 'f'])); // 报错