You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);

求助点

  1. 解决当前代码中的条件类型报错,找到符合要求的类型定义方案
  2. 推荐具备类似功能的NPM包

内容的提问来源于stack exchange,提问作者Volodymyr Usarskyy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 22:18:28