typeof的使用

2025-09-09 00:00

在 TypeScript 中,typeof 是一个非常强大的运算符,它有两个主要用途:一种用于 获取值的类型,另一种用于 获取类型的构造函数。下面我们分别解释这两种用途,并给出一些示例。

1. typeof 用于获取值的类型

在 TypeScript 中,typeof 可以用来获取一个值的类型。你可以通过 typeof 来推断或显式地获取变量的类型。

示例:获取值的类型

1let x = "hello";
2let y: typeof x;  // y 的类型会自动推断为 string
3
4y = "world";  // 正确
5// y = 42;    // 错误: 类型 'number' 不能赋值给类型 'string'

示例:获取对象属性的类型

1const person = { name: "Alice", age: 30 };
2let nameType: typeof person.name;  // nameType 的类型是 string
3let ageType: typeof person.age;    // ageType 的类型是 number

2. typeof 用于获取类型

typeof 还可以用来获取 类型的构造函数,特别是在你需要引用某个类型或类型的构造函数时。这个用途通常与 keyof 一起使用来限制某个值的类型。

示例:获取类的构造函数类型

 1class Person {
 2  name: string;
 3  constructor(name: string) {
 4    this.name = name;
 5  }
 6}
 7
 8let PersonConstructor: typeof Person;  // PersonConstructor 的类型是 `typeof Person`,即构造函数类型
 9PersonConstructor = Person;  // 正确
10// PersonConstructor = String;  // 错误: 类型 'typeof String' 不兼容类型 'typeof Person'

示例:通过 typeof 引用类型构造函数

1let x: number = 42;
2let y: typeof x;  // y 的类型是 number
3y = 123;  // 正确
4// y = "hello";  // 错误: 类型 'string' 不能赋值给类型 'number'

3. typeof 用于类型推断与类型保护

typeof 还可以用于类型保护,即在类型判断中帮助我们明确变量的类型。这对于某些复杂的类型检查很有用。

示例:typeof 在类型保护中的应用

 1function printLength(value: string | string[]) {
 2  if (typeof value === "string") {
 3    console.log(value.length);  // value 是 string 类型
 4  } else {
 5    console.log(value.length);  // value 是 string[] 类型
 6  }
 7}
 8
 9printLength("Hello");  // 输出: 5
10printLength(["a", "b", "c"]);  // 输出: 3

4. typeof 用于联合类型和字面量类型的推断

typeof 也能用来推断字面量类型(literal types)。

示例:推断字面量类型

1const color = "red";
2type Color = typeof color;  // Color 的类型是 "red"
3
4let myColor: Color = "red";  // 正确
5// let anotherColor: Color = "blue";  // 错误: 类型 '"blue"' 不能赋值给类型 '"red"'

总结

通过 typeof,你可以更灵活地在 TypeScript 中进行类型推断、类型保护和类型约束,增强代码的类型安全性和可维护性。