TypeScript忽略数组索引返回值的undefined类型问题咨询
核心原因:未开启严格空检查模式
你遇到的所有问题本质上都是因为TypeScript的strictNullChecks(严格空检查)处于关闭状态:
数组索引返回值未标记undefined
默认非严格模式下,TypeScript不会把数组索引访问的结果视为可能undefined——哪怕数组是空的,它也会认为arr()[0]的类型是{ s: string },而非{ s: string } | undefined。只有开启strictNullChecks后,TypeScript才会正确推断空数组索引访问的返回值可能为undefined。sArr的undefined被忽略
同样因为严格空检查关闭,TypeScript允许undefined/null隐式赋值给任何类型。你虽然显式标注sArr: string | undefined,但在给composedArr的s属性赋值时,TypeScript直接忽略了undefined部分,把它当成string处理,所以不会触发类型错误。
额外问题:类型声明与实际值不匹配
你给composedArr标注的类型是{ s: string } | undefined,但实际赋值的是一个必然存在的对象(只是s属性可能为undefined),正确的类型应该是{ s: string | undefined }。如果开启严格空检查,TypeScript会直接报错,提示你无法将{ s: string | undefined }赋值给{ s: string } | undefined——两者的类型完全不同:前者是“带可选属性的对象”,后者是“完整对象或undefined”。
验证方案
开启strictNullChecks(或直接开启strict总开关)后,你的代码会触发两个符合预期的类型错误:
- 若不使用
?.访问arr()[0].s,会提示“可能为undefined”; - 赋值
{ s: sArr }给{ s: string } | undefined时,会提示属性s的类型不兼容。
内容的提问来源于stack exchange,提问作者Atokon

