对于像这样的基类型:
interface BaseObject {
name: string;
age: number
}我想创建一个基于现有类型的新类型,这样我就可以创建一个模式化的新对象,如下所示:
const afterTransform: Transformed<BaseObject> = {
useName: () => '',
useAge: () => 1
}值的类型更改为返回原始类型的函数,并且键的名称有一个额外的前缀use,第一个字母大写。
如何在Typescript中做到这一点
我使用了新的模板文字语法,但没有任何运气:
interface Transformed<
BaseType extends BaseObject,
Key extends string & keyof BaseType,
CapitalizedKey extends Capitalize<Key>
> {
[`use${CapitalizedKey}`]: () => BaseType[Key]
}或者,对于当前的Typescript,这是可能的吗,这里发生的是我们需要在现有类型上创建新属性。

如果你想玩它,这是Typescript playground link。
发布于 2021-05-27 14:48:30
这可以通过在key remapping中使用映射类型来实现
type Transformed<BaseType> = {
[Key in keyof BaseType as `use${Capitalize<string & Key>}`]: () => BaseType[Key]
}发布于 2021-05-27 14:53:14
如下所示:
type Transformed<BaseType extends BaseObject> = {
[K in `use${Capitalize<string & keyof BaseType>}`]: () => BaseType[keyof BaseType]
}
const tr: Transformed<BaseObject> = {
useName: () => '',
useAge: () => 42,
}正如@Alksey L.指出的那样,它几乎是正确的:)。他的答案是正确的。
https://stackoverflow.com/questions/67716664
复制相似问题