如何让检查空值的函数实现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.
相关产品推荐
相关产品推荐

