typescript 如何推断索引访问类型所使用的键?

qxsslcnc  于 2023-03-19  发布在  TypeScript
关注(0)|答案(1)|浏览(114)

我想创建一个helper类型来推断索引访问类型中使用的键。

示例:

type X = { foo: string, bar: boolean }
type Fn = <T extends X>(value: T) => T["foo"]
type Helper<T> = ???

type Result = Helper<Fn> // should be "foo"

我尝试的方法类似于内置的ReturnType helper,但到目前为止还不起作用:

type Helper<Fn> = Fn extends (value: infer T) => infer R
  // R extends T[infer Key] does not work: Type 'Key' cannot be used to index type 'T'.
  ? R extends T[keyof T]
    ? T[keyof T]
    : never
  : never

这可能吗?

kiz8lqtg

kiz8lqtg1#

使用Map类型可以实现相当接近的效果,但这需要事先知道T是什么:

type Helper<T, Fn extends (...args: any[]) => any> = {
    [K in keyof T]: T[K] extends ReturnType<Fn> ? K : never;
}[keyof T];

type Result = Helper<X, Fn>;
//   ^? "foo"

但是,一个主要缺点是,如果X具有多个相同类型的密钥,

type X = { foo: string; bar: boolean; baz: string };

则结果将包括所有这些键:

type Result = Helper<X, Fn>;
//   ^? "foo" | "baz"

Playground

相关问题