使用 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;
对于每个任意对象,例如
{
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;