如何通过函数实现TypeScript对象属性的类型收窄?
解决TypeScript对象属性的类型收窄问题
你遇到的核心问题是:普通返回布尔值的函数无法让TypeScript关联到对象属性的类型收窄逻辑,只需用类型谓词函数就能解决,完全不需要创建新类型。
把你的判断函数改成下面这样即可:
type Test = { property: string | null } // 将返回类型从boolean替换为类型谓词 const propIsNotNull = (data: Test): data is { property: string } => { return data.property !== null } const testData: Test = { property: 'nonull' } if (propIsNotNull(testData)) { console.log(testData.property.toUpperCase()) // 不再报错 }
原理说明
类型谓词data is { property: string }明确告诉TypeScript:当函数返回true时,传入的data参数属于Test的子类型,且property必然是string而非null。TS会基于这个规则自动对testData做类型收窄,后续访问属性时就不会再提示可能为null。
如果是更复杂的嵌套类型,同样可以直接在类型谓词里描述收窄后的结构:
type NestedTest = { nested: { value: number | null } } const nestedValueIsNotNull = (data: NestedTest): data is { nested: { value: number } } => { return data.nested.value !== null }
这种方式既保留了代码的可读性,又通过类型谓词给TS补充了类型判断的逻辑关联,完全不需要额外定义新类型。
内容的提问来源于stack exchange,提问作者myol
相关产品推荐
相关产品推荐

