从函数回调推断泛型类型参数

Posted

技术标签:

【中文标题】从函数回调推断泛型类型参数【英文标题】:Infer generic type argument from function callback 【发布时间】:2020-03-12 11:56:39 【问题描述】:

给定一个函数foo,在这种情况下,类型参数T被正确推断为string

declare function foo<T>(callback: (bar: T) => void): void

// foo<string>(callback: (bar: string) => void): void
// ---> T is inferred string here
foo((bar: string) =>  )

但是,以下示例显示 T 被推断为 unknown。所以我的问题是:为什么类型不能解析为 T 嵌套在回调的对象类型中?

declare function foo2<T>(callback: (bar:  a: T ) => void): void

// foo2<unknown>(callback: (bar:  a: unknown; ) => void): void
// ---> T is inferred unknown here
foo2(( a: string ) =>  )

Sample code

【问题讨论】:

对我来说看起来像是一个错字...您不小心使用object destructuring 创建了一个名为string局部变量,这不是您想要的。 (注意foo2(( a: monkey ) =&gt; )不是错误,因为monkey是变量名,不是类型名。) 【参考方案1】:

我想这就是你要找的东西

declare function foo<T>(callback: (bar: T) => void): void
foo((bar: string) =>  )

declare function foo2<T>(callback: (bar: T) => void): void
foo2((a:  a: string ) =>  )

typescript playground

【讨论】:

以上是关于从函数回调推断泛型类型参数的主要内容,如果未能解决你的问题,请参考以下文章

打字稿泛型:从函数参数的类型推断类型?

Kotlin泛型总结 ★ ( 泛型类 | 泛型参数 | 泛型函数 | 多泛型参数 | 泛型类型约束 | 可变参数结合泛型 | out 协变 | in 逆变 | reified 检查泛型参数类型 )

013.泛型窗体常用属性

TS泛型类、泛型接口、泛型函数

Java核心技术卷一 6. java泛型程序设计

泛型之泛型方法