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 类型,非常的有用!