如何让TypeScript识别可选数组元素作为函数参数时非undefined
解决方案
报错的核心原因是可选属性会自动给类型加上undefined联合项,T["node"]["subfields"]的实际类型为ReadonlyArray<{id: string}> | undefined,而undefined类型不存在索引0,因此触发类型报错。
方法1:使用内置NonNullable工具类型(最简洁)
用TS内置的NonNullable工具类型先剔除类型中的undefined项,再取数组元素类型即可:
const myFunc = (param: NonNullable<T["node"]["subfields"]>[0]) => { // 此处param的类型已被正确推导为{ id: string } }
NonNullable的作用就是从联合类型中移除null和undefined,完全匹配你已经提前完成非空校验的场景,不需要修改第三方库生成的原始类型。
注意不要在类型标注位置使用
!非空断言,那是运行时语法,无法作用于类型推导,用NonNullable是类型层面的标准处理方案。
方法2:手动封装数组元素提取类型(兼容性更好)
如果使用的TS版本较低,也可以自己封装通用的数组元素提取类型,适配更多场景:
// 通用类型:提取只读数组/普通数组的元素类型 type ArrayElement<T extends readonly any[]> = T extends readonly (infer U)[] ? U : never // 代入你的场景得到subfields的元素类型 type SubfieldItem = ArrayElement<NonNullable<T["node"]["subfields"]>> const myFunc = (param: SubfieldItem) => { // 逻辑实现 }
内容的提问来源于stack exchange,提问作者totallynotweeb
相关产品推荐
相关产品推荐

