Test

141 阅读1分钟

关于泛型的补充 keyof 用法

keyof返回的是一个联合属性

const a = {
    a: 1,
    b: 2,
};
keyof typeof a; // 'a' | 'b'

class A {
    c: number;
    d: number;
}

keyof A; // 'c' | 'd'

而keyof和泛型搭配,达到的一个效果就是可以通过索引类型查询和索引访问操作符:

//  假设现在我想去拿到一个obj内部的指定属性的值
function getPropertyFromObj<T, K extends keyof T>(obj: T, key: K): T[K] {
    return obj[key];
}
let obj = {a: 1, b: 2};
getPropertyFromObj(obj, "a");
getPropertyFromObj(obj, "c"); // Argument of type '"c"' is not assignable to parameter of type '"a" | "b"'.

可以看到keyof在泛型中的应用,<T, K extends keyof T>约束了K的类型只能是T的属性生成的联合类型,而返回值: T[K]规定了只能返回目标对象的属性值中