【发布时间】:2018-08-28 22:39:01
【问题描述】:
我正在尝试在 TypeScript 中声明一个函数 fun,它使用其类型参数 T 作为可以将哪些键用作另一个函数 context.Foo 的参数的约束:
interface Context<T> {
Foo(key: keyof T)
}
function fun<T>(provider: (context: Context<T>) => T): number {
return 1
}
fun<{a: number}>(context => {
return {a: context.Foo('a')}
})
到目前为止一切顺利,我只能在底部的foo 调用中使用'a' 字面量作为context.Foo 的key 参数,因为这个调用有一个类型参数声明T 是{a: number}.
困扰我的是,我实际上将这种内联类型的结构定义为provider 函数体。我只能返回与{a: number} 定义匹配的对象。
我想要实现的是摆脱在调用时显式定义fun 的T 类型的需要,并让类型推断通过对象的结构自行确定该类型。 m 从fun的参数返回(必须是T),像这样:
fun(context => {
return {a: context.Foo('a')}
})
不幸的是,这以错误结束:
TS2345:“a”类型的参数不能分配给“never”类型的参数。
T 的类型推断失败并退回到never,这在这种情况下绝对没有用。
是否可以以不需要显式设置fun 的T 的方式定义此函数?
【问题讨论】:
-
Context.Foo的返回类型是什么?它总是相同的类型还是通用的? -
我认为这是不可能的,即使是即将到来的
infer。 -
@fathyb 可能是同一类型,比如
string。