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

Arj*_*jes 3 generics typescript typescript2.0

我正在尝试设置一个泛型,其中参数是另一个对象的键。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');
Run Code Online (Sandbox Code Playgroud)

游乐场链接

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

foo3是我的解决方法,但使用起来不太好,是否可以让打字稿执行此推理,或者这将是向 TS 团队的功能请求/错误报告?

Sha*_*ard 5

你与 很接近foo2。这就是让它发挥作用应该做的事情。

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

您可以将一个参数分配给一种类型(在本例中为 的类型T),而不是期待新的泛型类型参数。

也可以直接将参数类型分配给给keyof定的泛型类型T

declare function foo4<T>(x: keyof T);
let t4 = foo4<Bar>('t');
Run Code Online (Sandbox Code Playgroud)