繁体   English   中英

具有多个类型参数的泛型中的推断类型

[英]Inferred type in generic with multiple type parameters

我正在尝试设置一个泛型,其中参数是另一个对象的键。 当两种类型都是函数的参数时,我可以使用extends keyof完成此操作。

但是,当提供键列表的类型不是参数,而只是泛型类型时,打字稿要求同时设置两个泛型类型。

考虑以下代码:

interface Bar {
  z: string;
  t: number;
}

declare function foo1<T extends keyof Bar>(x: T)
let t1 = foo1('z');

declare function foo2<K, T extends keyof K>(x: T)
let t2 = foo2<Bar>('t');

declare function foo3<T>(x: T)
let t3 = foo3<keyof Bar>('t');

游乐场链接

由于未指定第二种类型T因此函数foo2失败。 但是我觉得TS应该能够在没有显式第二种类型的情况下推断出正确的类型。

foo3是我的解决方法,但使用起来不太好,是否可能让打字稿执行此推断,还是将其作为功能请求/错误报告给TS团队?

您与foo2接近。 这就是使它正常工作的原因。

declare function foo2<T, K = keyof T>(x: K)
let t2 = foo2<Bar>('t');

您可以为一个类型(在这种情况下为T的类型)分配一个而不是期望新的泛型类型参数。

它也可以直接指定PARAMATERS类型到keyof给定的泛型类型T

declare function foo4<T>(x: keyof T);
let t4 = foo4<Bar>('t');

Microsoft / TypeScript#14400上,已经存在关于部分推断类型参数(不使用默认值)的出色建议。 目前,您不能这样做。 相反,我将为您提供一种在以下情况下经常建议解决方法咖喱函数。

declare function curriedFoo<B>(): <T extends keyof B>(x: T)=>any;
let t4 = curriedFoo<Bar>()('t'); // okay

无参数函数curriedFoo()接受类型参数B (抱歉,我不能用K用作键),并返回您真正想要的类型的函数,缩小为仅接受T extends keyof B参数的T extends keyof B (这是我想使用K ,但是没关系)。

这有点笨拙,但可以完成工作。 希望能有所帮助; 祝好运!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM