Typescript:如何创建类型的副本但更改属性类型

Jak*_*ake 5 types typescript

我想为一个对象创建两种类型。对象本身的类型和验证错误的类型。这两种类型将具有相同的属性名称,但属性将具有不同的类型。

type Person = {
  name: string,
  age: number,
  married: boolean
}

type PersonValidationError = {
  name?: string,
  age?: string,
  married?: string
}

Run Code Online (Sandbox Code Playgroud)

在用户填写构建对象的表单后,Person我想通过一些验证来运行它,如果出现错误,我想创建错误对象,该对象将在相应的属性中包含错误消息。有没有一种方法可以将其PersonValidationErrorPerson类型本身联系起来,这样当我添加更多属性时,Person我就不必担心它们不同步。

我的第一个想法是使用keyof

type PersonValidationError = {
  [prop: keyof Person]: string
}
Run Code Online (Sandbox Code Playgroud)

但据我了解,这是无效的,keyof不能在索引签名中使用。

我也知道PersonValidationError它的所有属性都标记为可选,但如果我无法更改道具的要求,那也没关系,因为我总是可以将其包装在Partial<>

jca*_*alz 13

使用映射类型;它看起来类似于索引签名,但它使用in关键字:

type PersonValidationError = { [K in keyof Person]?: string }
Run Code Online (Sandbox Code Playgroud)

?使得属性可选。希望有帮助;祝你好运!

Playground 代码链接