You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在TypeScript中将typeof返回的字面量类型转换为对应实际类型本身?

如何在TypeScript中将typeof返回的字面量类型转换为对应实际类型本身?

嘿,我完全懂你说的这个场景!就像你举的例子那样,咱们先看这个函数:

function returnWithType(o: any, type: 'string' | 'number') {  
  if (typeof o === type) return o  
  throw new Error(`AHHHH!!!!!`)
}

你这里用typeof o的结果和传入的字面量类型type做比对,但现在的问题是,怎么把'string'这种字面量类型转换成它对应的实际类型string,对吧?

别担心,用TypeScript的条件类型就能轻松搞定!咱们可以先定义一个类型映射,把typeof返回的每个字面量字符串对应到实际类型:

// 定义字面量到实际类型的映射
type LiteralToType<T extends 'string' | 'number' | 'boolean' | 'object' | 'function' | 'undefined' | 'symbol'> = 
  T extends 'string' ? string :
  T extends 'number' ? number :
  T extends 'boolean' ? boolean :
  T extends 'object' ? object :
  T extends 'function' ? Function :
  T extends 'undefined' ? undefined :
  T extends 'symbol' ? symbol :
  never;

接下来把这个类型用到你的函数里,让返回值自动匹配正确的类型:

function returnWithType<T extends 'string' | 'number'>(o: any, type: T): LiteralToType<T> {  
  if (typeof o === type) {
    return o as LiteralToType<T>;
  }
  throw new Error(`AHHHH!!!!!`);
}

现在测试一下调用:

const myString = returnWithType('我是字符串', 'string');
// 这里myString的类型就是string,不再是any啦!

const myNumber = returnWithType(666, 'number');
// myNumber的类型是number,完美匹配!

其实核心思路就是通过条件类型做一个“翻译”,把typeof返回的那些字面量字符串类型,转换成它们对应的实际TypeScript类型。这样你的函数不仅能在运行时做类型检查,还能在编译时提供正确的类型提示。

备注:内容来源于stack exchange,提问作者user29889977

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 16:58:20