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
相关产品推荐
相关产品推荐

