使用 keyof 和模板文字输入

Typing with keyof and template literal

对于每个任意对象,例如

{
  name: string;
  age: number;
}

我想要一个类型,例如:

type ConsumerFn<T> = (value: T) => void;
type Consumer = {
  nameConsumer: ConsumerFn<string>;
  ageConsumer: ConsumerFn<number>;
}

我怎样才能让这个类型变得通用? 我正在成像:

type Consumer<T> = {
  [`${K in keyof T}Consumer`]: ConsumerFn<K>
}

但这不起作用。

以下映射类型应该可以工作,将属性转换为模板文字有点冗长

type ConsumerFn<T> = (value: T) => void;

type Consumer<Type> = {
    [Property in keyof Type as `${string & Property}Consumer`]: ConsumerFn<Type[Property]>
};

type Foo = {
  name: string;
  age: number;
}

type FooConsumer = Consumer<Foo>;

结果

type FooConsumer = {
   nameConsumer: ConsumerFn<string>;
   ageConsumer: ConsumerFn<number>;
}
type ConsumerGeneric<T> = keyof T extends string ? {
  [K in keyof T as `${K}Consumer`]: ConsumerFn<T>
} : never;