基于其参数类型的函数类型参数的TypeScript类型推断

NOtherDev

我正在尝试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.FoofooT{a: number}

令我困扰的是,我实际上将内联这种类型的结构定义为provider函数体。我只能返回匹配{a: number}定义的对象

我想要实现的是摆脱对在调用时显式定义Ttype的需要,fun而让类型推断通过我从fun的参数返回的对象的结构自行找出该类型。必须是T),例如:

fun(context => {
    return {a: context.Foo('a')}
})

不幸的是,这以错误结束:

TS2345:无法将类型“ a”的参数分配给类型“从不”的参数。

对于T失败和失败的类型推断,never在这种情况下绝对没有用。

是否有可能定义该功能以这样的方式,明确设置funT不需要?

提香·切尔尼科娃·德拉戈米尔

我认为没有任何方法可以实现这一目标,只要您尝试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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章