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

为何TypeScript函数在非严格模式下返回不同类型?

TypeScript非严格模式下函数返回类型推断差异的原因及解决方法

问题原因

非严格模式默认关闭了strictNullChecks编译选项,此时null和undefined会被视为所有类型的子类型,TypeScript的类型推断会忽略这两个值的存在,导致条件类型的判断逻辑出现偏差:

  • 当user类型为Nullable<IUser>时,非严格模式下TypeScript会优先匹配T extends IUser的分支,直接推断返回IUpdateUserRequest;而严格模式下会考虑T的所有可能(IUser/null/undefined),所以返回联合类型IUpdateUserRequest | ICreateUserRequest。
  • 当传入null时,非严格模式下TypeScript没有严格区分null与IUser的边界,仍保留联合类型返回;严格模式下明确T为null,所以匹配ICreateUserRequest分支。

解决方案

要在非严格模式下得到和严格模式一致的类型推断结果,可采用以下两种方式:

1. 局部启用严格空值检查

在当前文件顶部添加编译指令,强制开启该文件的strictNullChecks:

// @ts-strictNullChecks: true

这样即便项目全局是非严格模式,当前文件的类型推断逻辑会和严格模式对齐。

2. 优化函数的条件类型判断

修改函数的条件类型写法,利用分布式条件类型的特性,让非严格模式下也能正确遍历T的所有可能类型:

type Nullable<T> = T | null | undefined;

export const prepareFormDataForApi = <T extends Nullable<IUser>>(data: IFormData, user: T) => {
  return {
    ...data,
    ...(user ? { id: user.id } : data.email ? { isEmailVerified: true } : { isPhoneVerified: true })
  } as [T] extends [IUser] ? IUpdateUserRequest : ICreateUserRequest;
};

将原有的T extends IUser改为[T] extends [IUser]后,TypeScript会正确处理T的联合类型分支,无论是否开启严格模式,都能得到准确的推断结果:

  • 当user为Nullable<IUser>时,返回IUpdateUserRequest | ICreateUserRequest;
  • 当传入null时,返回ICreateUserRequest。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 23:28:29