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

TypeScript条件类型检测函数/泛型参数及实现可空值解析函数

嘿,我来帮你搞定这两个TypeScript相关的问题!

问题1:在TypeScript条件类型中,如何检测函数/泛型参数是否存在?

在TypeScript的条件类型体系里,我们可以结合内置工具类型和条件判断逻辑,分场景来检测参数是否存在:

检测泛型参数是否存在(或是否为默认值)

如果你的泛型参数设置了默认值、可能被省略,可以通过判断它是否等于默认类型或undefined来检测。举个实际例子:

// 条件类型:判断泛型T是否为默认的undefined(即未传入泛型参数)
type HasGenericParam<T = undefined> = T extends undefined ? false : true;

// 测试:省略泛型参数时,返回false
type Test1 = HasGenericParam; // false
// 传入泛型参数时,返回true
type Test2 = HasGenericParam<string>; // true

检测函数参数是否为可选参数

对于函数的参数,我们可以用Parameters工具类型提取参数列表的元组类型,再通过条件判断检测某个参数是否可选(即类型包含undefined):

// 条件类型:检测函数F的第N个参数是否可选
type IsParamOptional<F extends (...args: any[]) => any, N extends number> = 
  Parameters<F>[N] extends undefined ? true : false;

// 测试函数:第二个参数是可选的
function example(a: string, b?: number) {}

// 检测第二个参数(索引1)是否可选,返回true
type TestOptional = IsParamOptional<typeof example, 1>; // true
// 检测第一个参数(索引0)是否可选,返回false
type TestRequired = IsParamOptional<typeof example, 0>; // false

如果要判断函数是否包含足够数量的参数,还可以通过Parameters<F>['length']比较长度,比如判断函数是否至少有2个参数:

type HasAtLeastTwoParams<F extends (...args: any[]) => any> = 
  Parameters<F>['length'] extends 0 | 1 ? false : true;

type TestHasTwo = HasAtLeastTwoParams<(a: string, b: number) => void>; // true
type TestHasOne = HasAtLeastTwoParams<(a: string) => void>; // false
问题2:编写TypeScript版本的resolve函数

你想要的这个resolve函数,核心是处理null/undefined的输入值,返回有效值或默认值,同时还要保证类型推断准确。我们可以给它加上泛型约束,让TypeScript自动匹配输入输出的类型:

function resolve<T, U = null>(
  value: T | null | undefined,
  defaultValue: U = null as U
): T extends null | undefined ? U : T {
  if (value !== undefined && value !== null) {
    return value as T;
  } else {
    return defaultValue as U;
  }
}

设计思路说明:

  • 泛型T捕获输入value的非空类型,U是默认值的类型,默认设为null,和你JS版本的默认逻辑一致。
  • 返回类型用了条件类型:如果value是null或undefined,就返回U类型(默认值的类型),否则返回T类型(有效值的类型),这样TypeScript能精准推断返回值的类型。

测试用例参考:

// 传入有效值,返回该值,类型为string
const str = resolve("hello", "default"); // string
// 传入null,返回默认值,类型为number
const num = resolve(null, 123); // number
// 省略默认值,传入undefined,返回null,类型为null
const nil = resolve(undefined); // null

如果你的实际场景更复杂(比如默认值依赖value的类型),可以再调整泛型约束,但这个版本已经能覆盖大部分基础场景啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:35:48