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

Typescript中可选值的表示方式及getUser函数返回类型选择

关于 getUser 返回类型的选择

两者在运行时配合你写的 falsy 类型守卫的表现完全一致,差异只在语义和团队规范上:

  • 你认为 null 表意更明确的判断是合理的:undefined 在 JS 中有大量被动产生的场景(访问不存在的属性、函数无返回值、变量未初始化等),而 null 只能是开发者主动赋值的结果,用 User | null 可以明确区分「主动返回的空值」和「代码异常导致的意外 undefined」,更适合表示「查询无结果」这类业务层面的空状态。
  • 实际开发中 undefined 更普遍的核心原因是 TS 有大量原生语法默认关联 undefined(可选属性、可选参数等),不少团队没有强制规范的前提下,会直接统一用 undefined 减少心智负担。

如果你的团队没有特殊约定,两种写法都没问题,只要全项目统一就行。

关于可选属性简写的认知

这个认知基本正确,但存在一个容易忽略的差异:
name?: string 除了表示属性类型是 string | undefined 之外,还额外标注了该属性是「可选存在」的,你构造对应对象时可以完全省略这个属性;而如果显式写 name: string | undefined,表示属性必须存在,只是值可以为 undefined,示例如下:

type OptionalNameUser = {
  name?: string
}
// 合法,可省略name属性
const user1: OptionalNameUser = {}

type UndefinableNameUser = {
  name: string | undefined
}
// 报错:缺少name属性
const user2: UndefinableNameUser = {}
// 合法:显式赋值为undefined
const user3: UndefinableNameUser = { name: undefined }

函数的可选参数和显式 | undefined 参数也存在同样的差异:fn(name?: string) 支持不传参调用,fn(name: string | undefined) 必须传参(哪怕传 undefined)。


内容的提问来源于stack exchange,提问作者Toby

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 07:27:05