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

如何让检查空值的函数实现TypeScript类型收窄?

实现throwIfNullish的TypeScript类型收窄能力

要让你的工具函数同时保留运行时非空检查和TypeScript类型收窄效果,需要将其改造为断言函数(Assertion Function),结合泛型来传递并约束类型信息。

改造后的工具函数

// Utility debug function that throws an informative error if any of the arguments
// are nullish, also reporting the caller
export function throwIfNullish<T extends Record<string, unknown>>(
  caller: string,
  args: T
): asserts args is { [K in keyof T]: NonNullable<T[K]> } {
  Object.entries(args).forEach(([key, value]) => {
    if (typeof value === "undefined" || value === null) {
      throw new Error(`${caller} called with ${key} = ${value}`);
    }
  });
}

关键改造点说明

  • 泛型约束:用T extends Record<string, unknown>捕获传入args的具体键值对类型,确保函数只接收对象类型的参数。
  • 断言函数语法:asserts args is ...是TypeScript特有的语法,用于告诉类型系统:如果函数没有抛出错误,那么args的类型会被收窄为每个属性都移除了null和undefined的版本。
  • 内置工具类型:NonNullable<T[K]>是TypeScript内置工具类型,自动移除对应属性类型中的null和undefined。

使用示例

function someFn(a: string|undefined, b?: number|null): number {
    throwIfNullish("someFn", { a, b });
    // 此时TypeScript会自动将a收窄为string,b收窄为number
    return b + a.length; // 无类型错误
}

这种改造既保留了原函数运行时抛出明确错误的调试能力,又能让TypeScript像内联检查一样自动对变量进行类型收窄,完全适配你的需求。

内容的提问来源于stack exchange,提问作者Samuele B.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 09:40:47