![](/img/trans.png)
[英]TypeScript generic type parameters are inferred with functions, but not type?
[英]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.