类型别名返回结果中联合类型未包含undefined的异常问题咨询
问题原因
这是因为未开启TypeScript的strictNullChecks编译选项。当该选项关闭时:
- TypeScript会将
undefined和null默认视为所有类型的子类型,也就是说string本身就隐含了undefined的可能性 - 此时
T | undefined和T是完全等价的类型,所以AllowUndefined<string>的结果自然是string
解决方案
- 开启严格空检查(推荐)
在tsconfig.json中配置编译选项:
{ "compilerOptions": { "strictNullChecks": true, // 其他编译配置... } }
开启后,string与string | undefined会被视为两个不同的类型,你的类型别名就能按预期生成string | undefined。
- 临时hack方案(不推荐)
如果暂时无法开启严格模式,可以通过交叉类型强制排除undefined后再联合:
type AllowUndefined<T> = T & {} | undefined; type T = AllowUndefined<string>; // 此时T为string | undefined
原理是T & {}会过滤掉null和undefined(undefined & {}等于never),再和undefined联合就能得到预期类型。
内容的提问来源于stack exchange,提问作者Stefan
相关产品推荐
相关产品推荐

