如何为allDefined函数编写正确TypeScript类型以实现精准类型推断?
解决TypeScript中allDefined函数的类型推断问题
当前的allDefined函数无法根据输入参数是否包含undefined精准推断返回类型,总是返回T | undefined。我们需要调整类型定义,让函数在所有参数都非undefined时返回参数元组类型,只要有一个参数是undefined就返回undefined。
解决方案
首先定义一个辅助类型AllDefined,用于判断元组类型是否所有元素都不包含undefined:
type AllDefined<T extends readonly any[]> = T extends readonly { [K in keyof T]: Exclude<T[K], undefined> } ? T : undefined;
这个类型的逻辑是:如果元组T的每个元素类型排除undefined后仍等于自身(即元素本身没有undefined的可能),则返回原元组类型T;否则返回undefined。
然后修改函数的返回类型为AllDefined<T>,并添加类型断言让TypeScript认可运行时检查与返回类型的关联:
/** * 若任意参数为undefined则返回undefined,否则返回参数组成的数组 * @param parameters 要检查是否存在undefined的参数 * @returns 存在undefined时返回undefined,否则返回参数数组 */ export function allDefined<T extends readonly any[]>(...parameters: T): AllDefined<T> { if (parameters.some(p => p === undefined)) { return undefined as AllDefined<T>; } return parameters as AllDefined<T>; }
测试验证
// 返回类型:[number, number, number] const res1 = allDefined(1, 2, 3); // 返回类型:undefined const res2 = allDefined(1, 2, undefined); // 返回类型:[number, null](仅检查undefined,null不受影响) const res3 = allDefined(1, null); // 返回类型:undefined(第二个参数可能为undefined) const res4 = allDefined(1, 2 as number | undefined);
工作原理
辅助类型AllDefined通过映射类型遍历元组的每个元素,检查元素类型是否排除undefined后仍与自身一致。如果所有元素都满足条件,说明没有undefined参数,返回原元组类型;只要有一个元素不满足,就返回undefined。函数中的类型断言用于让TypeScript确认运行时检查逻辑与返回类型的匹配性。
内容的提问来源于stack exchange,提问作者Thomas Deutsch
相关产品推荐
相关产品推荐

