TypeScript条件类型判定错误:undefined校验后仍提示类型可能未定义
问题原因
- 你误判了报错的来源,TypeScript的类型收窄逻辑本身没有问题,你对
name的undefined判断确实已经将else分支内的name类型收窄为string,报错来自两个代码写法和预期逻辑不匹配的问题:- 返回的对象字面量写错了:你写的
{ name: value }是固定以字符串"name"为键、value为值的对象,根本没有使用前面声明的const name变量作为键。如果要把变量name的值作为对象键,必须使用ES6计算属性语法{ [name]: value },否则你对name做的类型收窄和返回值完全无关。 - 你只校验了
name不为undefined,没有校验value的类型:Record<string, string>要求对象所有值必须是string类型,但你解构出来的value类型是string | undefined,不满足类型约束,这才是触发类型报错的直接原因。
- 返回的对象字面量写错了:你写的
修复方案
- 第一步,将对象属性改为计算属性写法,确保使用收窄后的
name变量作为对象键 - 第二步,补充对
value的非空校验,保证返回对象的键和值都为string类型,符合返回值类型约束
修复后的可正常通过类型校验的代码如下:
type ConfigEntry = { name?: string, value?: string } function parser2(c: ConfigEntry): Record<string, string> | undefined { const name = c.name; const value = c.value; // 同时校验name和value均不为undefined if (name === undefined || value === undefined) return undefined; // 此处name、value均被收窄为string类型 return { [name]: value }; }
补充说明:如果你确实不需要用
name变量作为对象键,只是想返回固定键"name"的对象,那你对name的判断逻辑完全是多余的,只需要校验value不为undefined即可,直接返回{ name: value }就不会报错。
内容的提问来源于stack exchange,提问作者fires3as0n
相关产品推荐
相关产品推荐

