打字稿:如何创建类型的副本但如何更改属性类型

时间:2020-06-02 02:14:30

标签: typescript types

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

var
  ❤ : string;
  ⅖ : double;
begin
  ❤ := 'My heart';
  ShowMessage(❤);
  ⅖ := 0.4;
  ShowMessage(⅖.ToString);
end;

用户填写构建type Person = { name: string, age: number, married: boolean } type PersonValidationError = { name?: string, age?: string, married?: string } 对象的表单后,我想通过一些验证运行它,如果有错误,我要创建错误对象,该对象将在相应的属性中包含错误消息。有没有一种方法可以将PersonPersonValidationError类型本身联系在一起,这样当我向Person添加更多属性时,我不必担心它们会不同步。

我的第一个想法是使用Person

keyof

但这无效,据我了解,type PersonValidationError = { [prop: keyof Person]: string } 不能用于索引签名。

我也知道keyof的所有属性都标记为可选,但是如果我无法更改道具的要求,那就很好了,因为我总是可以将其包装在PersonValidationError

1 个答案:

答案 0 :(得分:2)

使用mapped type;它看起来类似于索引签名,但是它使用in关键字:

type PersonValidationError = { [K in keyof Person]?: string }

?使属性成为可选。希望能有所帮助;祝你好运!

Playground link to code