启用strictNullCheck后,TypeScript索引签名访问未提示undefined问题
问题解答
为什么没提示undefined?
开启strictNullChecks后,用Record<string, {value: string}>类型的对象访问不存在的键时没触发undefined提示,核心是TypeScript对索引签名类型的默认规则:
TypeScript默认认定,只要是符合索引签名的键(这里是任意string类型),对应的属性值一定存在。所以访问a["test"]时,类型会被推断为{value: string},不会自动追加undefined——哪怕你实际赋值的是空对象。
怎么让它触发提示?
有两种可行方案:
全局配置层面:在
tsconfig.json里额外启用noUncheckedIndexedAccess选项,这个配置专门用来约束索引访问的类型,强制加上undefined的可能性:{ "compilerOptions": { "strictNullChecks": true, "noUncheckedIndexedAccess": true } }启用后,
a["test"]的类型会变成{value: string} | undefined,再直接访问.value就会触发类型错误。局部类型层面:手动给
Record的值类型加上undefined联合,无需修改全局配置:const a: Record<string, {value: string} | undefined> = {}; // 访问时需要用可选链处理可能的undefined a["test"]?.value
内容的提问来源于stack exchange,提问作者ScreamZ
相关产品推荐
相关产品推荐

