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

为何无法推断泛型函数的约束?寻求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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 04:50:21