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

如何实现类型映射: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:40:18