如何通过在Typescript中使用模式操作属性,基于现有类型生成新类型

如何通过在Typescript中使用模式操作属性,基于现有类型生成新类型,typescript,Typescript,对于这样的基类型: interface BaseObject { name: string; age: number } 我想基于现有类型创建一个新类型,以便创建一个图案化的新对象,如: const afterTransform: Transformed<BaseObject> = { useName: () => '', useAge: () => 1 } 或者,对于当前的Typescript,这是否可能,这里发生的是我们需要在现有类型上创建新属性

对于这样的基类型:

interface BaseObject {
  name: string;
  age: number
}
我想基于现有类型创建一个新类型,以便创建一个图案化的新对象,如:

const afterTransform: Transformed<BaseObject> = {
  useName: () => '',
  useAge: () => 1
}
或者,对于当前的Typescript,这是否可能,这里发生的是我们需要在现有类型上创建新属性


如果您想玩它,这是一个。

这可以通过使用以下映射类型来实现:

类型转换={
[Key-in-keyof-BaseType为`use${Capitalize}`]:()=>BaseType[Key]
}
像这样:

type Transformed<BaseType extends BaseObject> = {
   [K in `use${Capitalize<string & keyof BaseType>}`]:  () => BaseType[keyof BaseType]
}

const tr: Transformed<BaseObject> = {
    useName: () => '',
    useAge: () => 42,
}
类型转换={
[K in`use${Capitalize}`]:()=>BaseType[keyof BaseType]
}
常数tr:Transformed={
useName:()=>“”,
用途:()=>42,
}

正如@Alksey L.指出的,这几乎是正确的:)。他的答案是正确的。

这是一个来自文档的教科书示例:
()=>BaseType[keyof BaseType]
将导致
()=>string | number
@AlekseyL。是的,我已经注意到。。。你的答案更好;)上帝,不知道我们可以在类型定义中做一个
作为
!看起来太灵活了。没关系,问题解决了!谢谢
type Transformed<BaseType> = {
  [Key in keyof BaseType as `use${Capitalize<string & Key>}`]: () => BaseType[Key]
}
type Transformed<BaseType extends BaseObject> = {
   [K in `use${Capitalize<string & keyof BaseType>}`]:  () => BaseType[keyof BaseType]
}

const tr: Transformed<BaseObject> = {
    useName: () => '',
    useAge: () => 42,
}