TypeScript中如何创建typeof返回值构成的动态联合类型
报错原因
typeof是JavaScript语法层面的内置操作符,不属于值空间的可引用实体——它既不是函数也不是变量,不存在可以被typeof关键字捕获类型的值实体。因此写typeof typeof时,TS编译器会直接抛出「找不到名称'typeof'」的错误,自然也无法通过ReturnType工具类型推导它的返回值。另外示例代码中的ReturType存在拼写错误,正确名称为ReturnType,但即使修正拼写,该写法依然无法正常工作。
实现方案
方案1:硬编码固定联合类型(生产环境推荐)
ECMAScript规范明确定义了typeof操作符的所有可能返回值,一共8种字符串字面量,直接定义即可100%覆盖所有场景,无额外类型推导开销:
type TypeOf = | "string" | "number" | "bigint" | "boolean" | "symbol" | "undefined" | "object" | "function"
补充说明:
typeof null返回"object"是规范定义的历史行为,该值已经被包含在上述联合类型中,无需额外补充。
方案2:类型体操动态推导
如果不想硬编码字面量,可以通过条件类型模拟typeof的判断逻辑,传入所有基础类型后自动推导出完整联合类型:
type TypeOfValue<T> = T extends string ? "string" : T extends number ? "number" : T extends bigint ? "bigint" : T extends boolean ? "boolean" : T extends symbol ? "symbol" : T extends undefined ? "undefined" : T extends Function ? "function" : "object"; // 传入所有可能触发不同typeof返回值的类型,得到完整联合 type TypeOf = TypeOfValue< string | number | bigint | boolean | symbol | undefined | Function | object | null >;
两种方案得到的TypeOf类型完全一致,都可以匹配所有合法的typeof返回值。
内容的提问来源于stack exchange,提问作者Teneff
相关产品推荐
相关产品推荐

