TypeScript函数参数type infer问题:data为函数时推断为unknown
问题原因及解释
核心原因
你遇到的泛型推断为unknown的问题,本质是TypeScript泛型推断的优先级和上下文约束规则导致的:
- 你的泛型参数
Data直接绑定到options.data的属性类型。当data是函数时,TypeScript无法直接确定你期望Data代表函数本身的类型还是函数返回值的类型,在没有额外上下文约束的情况下,推断机制会 fallback 到unknown。 - 当
data是对象类型时,对象的字面量结构是明确的,TypeScript可以直接将其结构推断为Data的类型;而把getData加入泛型参数后,相当于给推断系统提供了更多关联信息,帮助锁定正确的类型范围。
正确的泛型声明方式
如果你期望Data代表data函数的返回值类型,需要调整泛型绑定的位置,将Data关联到函数的返回值,而非函数本身:
declare function getTypeOf<Data>(options: { data: () => Data }): Data; // 此时Data会被正确推断为 { name: string; age: number; } getTypeOf({ data() { return { name: "123", age: 1 }; }, getData() { return { name: 123 }; }, });
官方文档参考
TypeScript官方手册中,**类型推断(Type Inference)和泛型(Generics)**章节详细说明了这类推断规则:
- 泛型参数的推断依赖明确的上下文关联,当参数类型是函数时,需要显式将泛型绑定到函数的输入/输出,否则会出现推断模糊。
- 当泛型参数没有足够的约束条件时,TypeScript会使用
unknown作为默认的推断结果。
内容的提问来源于stack exchange,提问作者方嘉汇
相关产品推荐
相关产品推荐

