为何无法推断泛型函数的约束?寻求IsGeneric类型实现方案
问题分析与解决方案
为什么ExpectedTrue是false?
你的代码中:
type GenericGeneric<S> = <T extends S>(x: T) => T; type GenericNumber = <T extends number>(t: T) => T; type ExpectedTrue = GenericNumber extends GenericGeneric<infer _> ? true : false; // 结果为false
GenericGeneric<S>是一个泛型类型别名——它接受一个类型参数S,返回一个泛型函数类型;而GenericNumber是直接定义的泛型函数类型。
当使用GenericNumber extends GenericGeneric<infer _>时,TypeScript需要推断出一个确定的S,使得GenericGeneric<S>与GenericNumber兼容。但这里存在多个合法的S(比如number、unknown、any),TypeScript无法确定唯一的推断结果,因此条件判断返回false。
实际上,当你明确传入S=number时,两者是完全等价的:
type Test1 = GenericGeneric<number> extends GenericNumber ? true : false; // true type Test2 = GenericNumber extends GenericGeneric<number> ? true : false; // true
实现IsGeneric类型
要判断一个函数类型是否包含泛型参数,可以利用TypeScript 4.0+支持的可变泛型参数来匹配任意带有泛型参数的函数:
// 先判断是否为函数类型,再判断是否带泛型参数 type IsGeneric<F> = F extends (...args: any[]) => any ? F extends <..._>(...args: any[]) => any ? true : false : false;
测试用例
type TestGenericFunc = IsGeneric<GenericNumber>; // true type TestNonGenericFunc = IsGeneric<(x: number) => number>; // false type TestMultiGenericFunc = IsGeneric<<U, V>(a: U, b: V) => [U, V]>; // true type TestGenericAliasInstance = IsGeneric<GenericGeneric<number>>; // true(实例化后是泛型函数) type TestGenericAlias = IsGeneric<GenericGeneric>; // false(本身是类型构造器,不是函数类型)
内容的提问来源于stack exchange,提问作者Uri
相关产品推荐
相关产品推荐

