如何实现类型映射:T为可选时R=T,非可选时R=T?
解决方案:将非可选类型转为可选,可选类型保持不变
嘿,这两个问题本质上是同一个需求——我们需要一个类型工具,让非可选类型变成可选,同时保留原本就是可选的类型不变。下面我来给你详细讲实现方式:
核心类型工具实现
我们可以利用TypeScript的条件类型和类型推断来完成这个判断。这里有两种清晰的写法:
写法一:直接判断是否包含undefined
type MakeOptionalIfNot<T> = T extends undefined ? T : T | undefined;
写法二:明确匹配可选类型结构
type MakeOptionalIfNot<T> = T extends (infer U) | undefined ? T : U | undefined;
工作原理解释
两种写法的效果是一致的,我们拿第一种来拆解:
- 如果
T本身就是可选类型(比如string | undefined):T extends undefined不成立,会返回T | undefined,但因为T已经包含undefined了,所以结果还是原来的T,相当于保持不变。 - 如果
T是非可选类型(比如string):T extends undefined不成立,返回T | undefined,也就是把它转换成了可选类型,完美符合你的需求。
应用到foo函数中
现在把这个类型工具用到你的foo函数里,代码如下:
type MakeOptionalIfNot<T> = T extends undefined ? T : T | undefined; function foo<T>(value: T): MakeOptionalIfNot<T> { // 这里用类型断言是因为TypeScript无法自动推断返回类型,实际逻辑直接返回value即可 return value as MakeOptionalIfNot<T>; }
测试示例
我们来验证一下效果:
// 传入非可选string,返回值类型为string | undefined const result1 = foo("hello"); // 传入可选的string | undefined,返回值类型保持为string | undefined const result2 = foo(Math.random() > 0.5 ? "world" : undefined);
这样就完全满足你的要求啦!
内容的提问来源于stack exchange,提问作者Constructor
相关产品推荐
相关产品推荐

