是否有实用程序类型或类似的东西从另一个派生密钥的名称?
Is there a utility type or something similar derive the name of a key from another?
希望不大,但我希望能够从现有界面生成一个新界面,但键名是为原始界面派生的。
下面是我希望能够做的事情的示例:
鉴于此源对象:
interface Car {
brand: Brand;
model: string;
year: number;
}
我希望能够声明一个接口:
interface CarSetters {
setBrand: (brand: Brand) => any;
setModel: (model: string) => any;
setYear: (year: number) => any;
}
但我不想像上面那样手动声明它。相反,我希望能够像这样使用它:
type CarSetters = Setters<Car>
或
type CarState = Car & Setters<Car>
看起来是一个非常简单的映射:
type Brand = boolean;
interface Car {
brand: Brand;
model: string;
year: number;
};
type CarSetters = {
[T in keyof Car as `set${Capitalize<T>}`]: (newValue: Car[T]) => any;
};
为了防止符号引起问题,您可以这样做:
type CarSetters = {
[T in keyof Car as T extends symbol ? never : `set${Capitalize<T>}`]: (newValue: Car[T]) => any;
};
或
type CarSetters = {
[T in keyof Car as T extends symbol ? never : `set${Capitalize<T>}`]: (newValue: Car[T]) => any;
} & {
[T in keyof Car as T extends symbol ? T : never]: Car[T];
};
我能够设计出一个完全符合我要求的泛型,这主要归功于 ,我已经接受了它,因为它确实回答了我提出的问题。但我也分享了我想出的泛型:
type Setters<T> = {
[K in keyof T as K extends string ? `set${Capitalize<K>}` : never]: (
value: T[K]
) => any;
};
type State<T> = T & Setters<T>
希望不大,但我希望能够从现有界面生成一个新界面,但键名是为原始界面派生的。
下面是我希望能够做的事情的示例:
鉴于此源对象:
interface Car {
brand: Brand;
model: string;
year: number;
}
我希望能够声明一个接口:
interface CarSetters {
setBrand: (brand: Brand) => any;
setModel: (model: string) => any;
setYear: (year: number) => any;
}
但我不想像上面那样手动声明它。相反,我希望能够像这样使用它:
type CarSetters = Setters<Car>
或
type CarState = Car & Setters<Car>
看起来是一个非常简单的映射:
type Brand = boolean;
interface Car {
brand: Brand;
model: string;
year: number;
};
type CarSetters = {
[T in keyof Car as `set${Capitalize<T>}`]: (newValue: Car[T]) => any;
};
为了防止符号引起问题,您可以这样做:
type CarSetters = {
[T in keyof Car as T extends symbol ? never : `set${Capitalize<T>}`]: (newValue: Car[T]) => any;
};
或
type CarSetters = {
[T in keyof Car as T extends symbol ? never : `set${Capitalize<T>}`]: (newValue: Car[T]) => any;
} & {
[T in keyof Car as T extends symbol ? T : never]: Car[T];
};
我能够设计出一个完全符合我要求的泛型,这主要归功于
type Setters<T> = {
[K in keyof T as K extends string ? `set${Capitalize<K>}` : never]: (
value: T[K]
) => any;
};
type State<T> = T & Setters<T>