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

Typescript 泛型中具有多个类型参数的推断类型,typescript,generics,typescript2.0,Typescript,Generics,Typescript2.0,我正在尝试设置一个泛型,其中参数是另一个对象的键。当两种类型都是函数的参数时,我可以使用extends-keyof来实现这一点 但是,当提供键列表的类型不是参数,而是泛型类型时,typescript要求同时设置这两种泛型类型 考虑以下代码: interface Bar { z: string; t: number; } declare function foo1<T extends keyof Bar>(x: T) let t1 = foo1('z'); declare

我正在尝试设置一个泛型,其中参数是另一个对象的键。当两种类型都是函数的参数时,我可以使用
extends-keyof
来实现这一点

但是,当提供键列表的类型不是参数,而是泛型类型时,typescript要求同时设置这两种泛型类型

考虑以下代码:

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');
接口栏{
z:字符串;
t:数字;
}
声明函数foo1(x:T)
设t1=foo1('z');
声明函数foo2(x:T)
设t2=foo2('t');
声明函数foo3(x:T)
设t3=foo3('t');

函数
foo2
失败,因为未指定第二种类型
T
。然而,我觉得TS应该能够在没有明确的第二种类型的情况下推断出正确的类型


foo3
是我的解决方法,但使用起来不是很好,是否可以让typescript执行此推断,或者这是向TS团队提交的功能请求/错误报告?

目前已经有一个关于部分推断类型参数(不使用默认值)的未决建议。现在,你不能这么做。相反,在这种情况下,我将给你一个例子:函数

declare function curriedFoo<B>(): <T extends keyof B>(x: T)=>any;
let t4 = curriedFoo<Bar>()('t'); // okay
声明函数curriedFoo():(x:T)=>any;
设t4=curriedFoo()('t');//可以
无参数函数
curriedFoo()
接受一个类型参数
B
(对不起,除了一个键之外,我不能使用
K
),并返回一个您真正想要的类型的函数,范围缩小到只接受一个
t extends keyof B
参数(这里是我想使用
K
,但没关系)


这有点笨拙,但它完成了任务。希望有帮助;祝你好运

您与
foo2
关系密切。这就是它的作用

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

谢谢你的选择。不幸的是,它不允许严格的类型检查,因为K可以显式传递,并且与T不兼容。@Arjes您也可以直接执行
func(x:keyof T)
。这是完美的,并将以同样的方式确保类型安全。但是做两个层次的深是肮脏的
func(x:keyof T,y:keyof T[typeof x])
但没有编译器警告!我希望我有选举你的名声。
declare function foo4<T>(x: keyof T);
let t4 = foo4<Bar>('t');