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

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 13:20:33