【问题标题】:TypeScript convert subtype to supertype and remove extra fieldsTypeScript 将子类型转换为超类型并删除额外的字段
【发布时间】:2022-02-23 00:37:40
【问题描述】:

如果我们有这些类型:

interface Person {
  name: string;
}
interface Agent extends Person {
  code: number;
}

并拥有此代码:

const agent: Agent = {
  name: 'name',
  code: 123
}

如何将类型 Agent 转换为 Person 并删除代码字段?当我尝试这样做时:

const person: Person = agent as Person
console.log(person) // Still contains the fields of agent

这是一个简单的例子,但在我的真实用例中,该对象有更多的字段。我也试过:

person: Person = {
...agent
}

我看过的另一篇文章不适用于我的情况: Restrict type by super class in interface.

【问题讨论】:

  • 你见过this question吗?
  • @DavidScholz 哦,哇,我用谷歌搜索了很多,但没有找到,谢谢
  • 如果Agent的额外属性数量有限,可以const { code, ...person} = agent
  • @www.admiraalit.nl 是的,这就是我推测我可以做的,但对于我的用例来说,它使它有点不切实际/烦人。我总是可以只做一次并创建一种方法来进行转换。谢谢!

标签: typescript


【解决方案1】:

铸造并不意味着被铸造的东西中的真实价值会改变。开发人员应该告诉 TypeScript“相信我,我知道里面有什么”。它仅在开发期间有意义,而不是在运行时。

对于开发部分,也许Utility Types 会有所帮助。例如,您可以这样做(如果您想将 Agent 中的某些字段保留在 Person 中):

type Person = Pick<Agent, "name"|"address">;

【讨论】:

  • 我还没有见过pick之类的实用程序类型,真是太棒了,我将来可能会使用它。查看答案here 不可能删除额外的字段。非常感谢您的支持
  • 是的,你不能用铸造。是的,实用程序类型在某些情况下很棒。很高兴我能传递信息!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-26
  • 1970-01-01
  • 1970-01-01
  • 2021-10-27
  • 2019-02-09
  • 2012-05-25
  • 1970-01-01
相关资源
最近更新 更多