TypeScript如何识别联合类型中的null并实现输入输出类型匹配?
问题解答
初始代码报错的原因与修复
你遇到的类型报错核心是 TypeScript 配置问题:
- 检查你的
tsconfig.json中compilerOptions下的strictNullChecks是否设置为true。该配置是 TypeScript 实现空值类型收窄的基础,未开启时UserSession | null类型中的null会被忽略,if (userSession)判断无法将 else 分支的userSession类型收窄为null,仍然会被识别为UserSession类型,因此返回时会提示缺少UserProfile的必填属性。 - 修复方案:
- 优先开启
strictNullChecks,开启后你的初始代码逻辑完全符合类型要求,不会再触发报错。 - 如果暂时无法开启该配置,可以手动对 else 分支的返回值做类型断言:
return userSession as null。
- 优先开启
输入输出类型联动的实现方案
你当前使用的函数重载是 TypeScript 官方推荐的标准实现,可读性强,针对你当前的两种输入场景完全适用,没有性能或类型安全问题,可以正常使用。
如果想要更简洁的实现,可以使用泛型+条件类型的写法,代码量更少,效果和重载完全一致:
export const maybeMapUserSessionToUserProfile = <T extends UserSession | null>( userSession: T ): T extends UserSession ? UserProfile : null => { if (userSession) { return mapUserSessionToUserProfile(userSession) as any; } return null as any; };
注:代码中的
as any是当前 TypeScript 版本对条件类型返回值推导能力不足导致的必要断言,不会影响函数外部调用的类型安全,调用时会自动根据入参类型匹配对应的返回值类型:传入UserSession返回UserProfile,传入null返回null。
内容的提问来源于stack exchange,提问作者J. Hesters
相关产品推荐
相关产品推荐

