原文链接:https://juejin.cn/post/6844904145732763655#heading-0
keyof
定义
keyof与Object.keys略有相似,只是 keyof 是取 interface 的键,而且 keyof 取到键后会保存为联合类型。
interface iUserInfo {
name: string;
age: number;
}
type keys = keyof iUserInfo;
keyof 的简单栗子
我们有这样一个需求,实现一个函数 getValue 取得对象的 value。在未接触 keyof 时,我们一般会这样写:
function getValue(o: object, key: string) {
return o[key];
}
const obj1 = { name: '张三', age: 18 };
const name = getValue(obj1, 'name');
但是,这样写就丧失了 ts 的优势:
- 无法确定返回值类型
- 无法对 key 进行约束,可能会犯拼写的错误
这时我们可以使用 keyof 来增强 getValue 函数的类型功能。
使用 keyof 后我们可以看到,可以完整的提示可以输入的值,当拼写错误时也会有清晰的提示。
function getValue<T extends Object, K extends keyof T>(o: T, key: K): T[K] {
return o[key];
}
const obj1 = { name: '张三', age: 18 };
const a = getValue(obj1, 'hh');
in
in用于取联合类型的值。主要用于数组和对象的构造。
但切记不要用于 interface,否则会出错
type name = 'firstName' | 'lastName';
type TName = {
[key in name]: string;
};
const data1 = [
{
a1: 'a',
b1: 'b',
c1: 'c',
d1: 'd',
},
];
const data2 = [
{
a2: 'a',
b2: 'b',
},
];