TypeScript keyof 和 typeof

发布时间 2023-04-17 02:21:58作者: Himmelbleu

typeof

typeof 是 JS 本身就有的一个操作符,只不过在 TS 中多了一个功能。typeof 在 JS 中是获取变量的类型字符串:

console.log(typeof 42);
// "number"
console.log(typeof 'blubber');
// "string"
console.log(typeof true);
// "boolean"

在 TS 中的 typeof 可以返回一个变量的 TS 类型,也可以返回一个变量的类型字符串:

let num = 42;
type A1 = typeof num;
//   ^? number

console.log(typeof 42);
// "number"

区别之处就是你要用在 interface 或者 type 关键字声明的类型变量中,而不是当做一个普通变量进行输出。

注意:TS 的类型不可以直接通过 log 打印到控制台,只有变量才可以,而非类型变量。

keyof

keyof 不是 JS 特有的,而是 TS 特有的,keyof 用于得到一个对象的属性的联合类型。

interface Person {
    name: string;
    age: number;
}

type A1 = keyof Person;
//   ^? "name" | "age"

keyof 操作的是一个 TS 类型;typeof 操作的是一个变量,返回变量对应的类型字符串或变量对应的 TS 类型。

keyof 和 typeof

typeof 操作一个变量,运算出 TS 类型,keyof 运算一个已知的 TS 类型。两者结合起来:keyof 通过由 typeof 运算的对象的 TS 类型,从而得到该对象的属性联合类型。

const obj = {
    name: "小明",
    age: 12
}

type A1 = keyof typeof obj;
//   ^? "name" | "age"

如果 obj 每一次的属性都是不一样的,两者结合起来可以实现动态得到一个对象的 TS 类型,非常的有用!