重新映射类型中的键

Oli*_*ini 3 typescript

我想创建一个 type ( ) ,它将被定义为具有扩展的U某些给定类型的键。这个新类型的值将被定义为函数,该函数将采用原始类型上该键的值类型并返回相同的类型。TTObjectT

例如,如果我有以下类型I1

interface I1 {
  a: number;
  b: Date;
}
Run Code Online (Sandbox Code Playgroud)

那么就U<I1>等于:

{
  a: (x: number) => number;
  b: (x: Date) => Date;
}
Run Code Online (Sandbox Code Playgroud)

我确实看过一些类似的选项keyof,但我还没有弄清楚如何最好地做到这一点。我尝试过,例如:

export type U<T extends {}, K extends keyof T, V extends T[K]> = Record<K, (x: V) => V>;
Run Code Online (Sandbox Code Playgroud)

但是您需要为每个泛型定义显式类型。似乎可以使用key remapping来重新映射 ts 4 中的键,但现在我被困在 3.7.1 上。

关于如何实现这一目标有什么想法吗?

dou*_*oup 7

我认为这样的事情应该有效:

type U<T> = {
    [Prop in keyof T]: (x: T[Prop]) => T[Prop];
}
Run Code Online (Sandbox Code Playgroud)

您可以使用以下方法进行测试:

type Test = U<I1>;
Run Code Online (Sandbox Code Playgroud)

当您将鼠标悬停在上面时,Test您应该会看到所需的签名。