TypeScript带默认值的tryParseInt实现及条件类型问题求助
TypeScript实现tryParseInt辅助方法的类型问题
需求说明
我要实现一个简单的辅助方法tryParseInt,参数规则如下:
- 第一个参数类型:
any或null - 第二个参数类型:
number或null
返回结果规则:
- 解析成功时,返回
{success: true, value: number} - 解析失败时:
- 若默认值为
null,返回{success: false, value: null} - 若默认值为
number,返回{success: false, value: number}
- 若默认值为
我的核心目标是:当解析失败且未指定默认值时,触发编译错误。比如下面这段代码应该报错:
const result = tryParseInt('blah'); const num1: number = result.success === true ? result.value : result.value;
当前实现与问题
我已经完成了大部分代码,但在条件类型部分卡壳了。不允许使用双重表达式,找不到替代R = T extends true ? number : DT extends number ? number : null的合适方案。
报错信息
Type 'DV' is not assignable to type 'number | (DV extends number ? number : null)'. Type 'number | null' is not assignable to type 'number | (DV extends number ? number : null)'. Type 'null' is not assignable to type 'number | (DV extends number ? number : null)'.(2322)
当前代码
type TryParseIntResult< T extends boolean, DT extends number | null, R = T extends true ? number : DT extends number ? number : null > = {success: T, value: R}; function tryParseInt<DV extends number | null>(value: any | null, defaultValue: DV) : TryParseIntResult<true, DV> | TryParseIntResult<false, DV> { if (value == null) { return {success: false, value: defaultValue}; } if (typeof value === 'number') { return {success: true, value: value}; } const parsedValue = parseInt(value, 10); if (isNaN(parsedValue)) { return {success: false, value: defaultValue}; } return {success: true, value: parsedValue}; }
Zod尝试结果(更新)
按照建议尝试了Zod,但当前版本的表现不符合预期:
const numberSchemaWithDefault = z.number().default(12); const intSchemaWithDefault = z.number().int().default(22); const intParseResult1 = numberSchemaWithDefault.safeParse("blah"); const intParseResult2 = intSchemaWithDefault.safeParse("blah"); console.log(intParseResult1.success); // 实际输出false,期望返回带默认值的"fallback"结果 console.log(intParseResult2.success); // 实际输出false,期望返回带默认值的"fallback"结果 if (intParseResult1.success) { console.log(intParseResult1.data); // 永远不会执行 } if (intParseResult2.success) { console.log(intParseResult2.data); // 永远不会执行 } const intParseResult3 = numberSchemaWithDefault.parse("blah"); // 实际抛出错误,期望返回12 const intParseResult4 = intSchemaWithDefault.parse("blah"); // 实际抛出错误,期望返回22 console.log(intParseResult3); console.log(intParseResult4);
求助点
- 解决当前代码中的条件类型报错,找到符合要求的类型定义方案
- 推荐具备类似功能的NPM包
内容的提问来源于stack exchange,提问作者Volodymyr Usarskyy
相关产品推荐
相关产品推荐

