如何在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
相关产品推荐
相关产品推荐

