Typescript结合fp-ts/Option实现toOption时泛型残留undefined问题
问题根因
你的泛型参数T直接继承了入参的完整类型,如果入参本身的类型包含undefined/null,那么T的推导结果就会携带这两个类型,哪怕运行时你做了空值过滤,类型层面也不会自动排除,导致最终返回的Option<T>残留了空类型。另外你之前写的typeof val == undefined是错误写法,typeof运算符返回的是字符串,正确的空值判断可以直接用val == null,会同时匹配null和undefined两种空值情况,覆盖更全面。
解决方案
用TS内置的NonNullable<T>工具类型,从泛型T中排除null和undefined,对齐运行时的空值过滤逻辑即可,推荐两种实现:
- 复用fp-ts原生的
fromNullable(和fp-ts生态语义完全一致)
import { Option, fromNullable } from 'fp-ts/Option' export const toOption = <T>(val: T): Option<NonNullable<T>> => { return fromNullable(val) as Option<NonNullable<T>> }
- 手动实现空值判断
import { Option, none, some } from 'fp-ts/Option' export const toOption = <T>(val: T): Option<NonNullable<T>> => { if (val == null) { return none } return some(val as NonNullable<T>) }
修改后调用toOption(attributes.airDate)时,如果入参attributes.airDate的类型是string | Date | undefined,返回值类型会自动推导为Option<string | Date>,完全移除undefined类型,符合预期。
内容的提问来源于stack exchange,提问作者Daryl
相关产品推荐
相关产品推荐

