我正在尝试fun
在TypeScript中声明一个函数,该函数使用其类型参数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')}
})
到目前为止,我只能在底部的调用中使用'a'文字作为key
参数,因为该调用具有一个声明为is的类型参数。context.Foo
foo
T
{a: number}
令我困扰的是,我实际上将内联这种类型的结构定义为provider
函数体。我只能返回匹配{a: number}
定义的对象。
我想要实现的是摆脱对在调用时显式定义T
type的需要,fun
而让类型推断通过我从fun
的参数返回的对象的结构自行找出该类型。必须是T
),例如:
fun(context => {
return {a: context.Foo('a')}
})
不幸的是,这以错误结束:
TS2345:无法将类型“ a”的参数分配给类型“从不”的参数。
对于T
失败和失败的类型推断,never
在这种情况下绝对没有用。
是否有可能定义该功能以这样的方式,明确设置fun
的T
不需要?
我认为没有任何方法可以实现这一目标,只要您尝试Context<T>
将结果的键绑定起来,编译器就会放弃推理。
由于Foo
总是返回相同的值类型(至少从我在注释中理解的),您可以仅指定该类型的键,而不必指定整个类型:
interface Context<K> {
Foo(key: K): number;
}
function fun<K extends string>(provider: (context: Context<K>) => Record<K, number>): Record<K, number> {
return provider(null as any);
}
let a = fun<'a'>(context => {
return { a: context.Foo('a') }
})
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句