使用Ramda构建类型断言时的参数类型标注异常问题
解决Ramda类型断言参数类型被限定的问题
你当前的实现中,R.is(Number)的类型守卫会将输入值的类型缩窄为Number(包含原始类型和包装对象),导致整个断言函数的参数被标注为number,不符合你“支持任意类型参数”的需求。需要说明的是,你的代码已经通过R.is(Number)排除了null(因为R.is(Number, null)返回false),可以通过以下方式调整类型标注或实现逻辑:
方案1:手动指定类型签名(TypeScript)
直接给断言函数添加unknown类型的参数和类型守卫返回值,让参数支持任意类型:
const isNumber: (val: unknown) => val is number = R.both( R.is(Number), R.complement(R.equals(NaN)) );
这个方案保留了对Number包装对象的判断(比如new Number(10)会被判定为有效数字)。
方案2:仅判断原始number类型
如果你只需要识别原始类型的数字(排除Number包装对象),可以改用typeof检查:
const isNumber: (val: unknown) => val is number = R.both( (val) => typeof val === 'number', R.complement(R.equals(NaN)) );
这里typeof val === 'number'会匹配原始数字和NaN,再通过R.complement(R.equals(NaN))排除NaN,同时参数类型为unknown,满足任意类型输入的要求。
内容的提问来源于stack exchange,提问作者Vlad
相关产品推荐
相关产品推荐

