TypeScript中typeof赋值给const变量时为何表现特殊?代码疑问
typeof赋值给const变量和type会有不同表现? 先看你给出的代码:
const person = { name: 'Joe', age: 25 }; type personType = typeof person; const foo = typeof person;
这里的核心是TypeScript里的typeof有两个完全独立的用法,一个在类型系统上下文里,一个在JavaScript值上下文里,这俩完全不是一回事:
1. 类型上下文的typeof:提取变量的TS静态类型
当你写type personType = typeof person;时,你是在TypeScript的类型系统中使用typeof——它的作用是提取变量/值的静态类型。
对于你的person常量,TypeScript会自动推断它的类型是{ name: string; age: number; },所以personType就等于这个明确的对象类型,后续你可以用它来约束其他变量:
const anotherPerson: personType = { name: 'Alice', age: 30 }; // 完全合法
2. 值上下文的typeof:JavaScript原生运行时运算符
而当你写const foo = typeof person;时,你是在使用JavaScript原生的typeof运算符——这是一个运行时操作,它会返回一个字符串,表示参数的运行时类型。
JavaScript的typeof针对不同值会返回固定的几种字符串:比如对象返回"object"、函数返回"function"、字符串返回"string"等。TypeScript作为JS的超集,明确知道typeof的所有可能返回值,所以它会把foo的类型推断为这些字符串的联合类型:"string" | "number" | "bigint" | "boolean" | "symbol" | "undefined" | "object" | "function"。
这绝对不是any的别名——它是一个明确的字符串字面量联合类型,意味着foo只能是这几个字符串中的一个,而any可以是任意类型。比如你尝试给foo赋值不在这个联合里的字符串,TypeScript会直接报错:
foo = "array"; // 报错:类型'"array"'不能赋值给类型'"string" | "number" | ...'
一句话总结
- 写在
type/interface等类型定义里的typeof:属于TypeScript类型系统,用来提取静态类型 - 写在变量赋值、函数逻辑里的
typeof:属于JavaScript原生语法,是运行时的类型检测,返回字符串
内容的提问来源于stack exchange,提问作者wlf

