TypeScript 将子类型转换为父类(super class)型并删除额外的字段

标签 typescript

如果我们有这些类型:

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 .

最佳答案

类型转换并不意味着类型转换后的真实值(value)会改变。开发者可以告诉 TypeScript“相信我,我知道里面是什么”。它仅在开发期间才有意义,而在运行时则没有意义。

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

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

关于TypeScript 将子类型转换为父类(super class)型并删除额外的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71222416/

相关文章:

typescript - Typescript 接口(interface)范围如何工作?如何使接口(interface)全局化?

javascript - 在 onBeforeInput 处理程序中 react : how to use event. 数据而没有 TypeScript 错误

asp.net-mvc - NullInjectorError : No provider for HttpClient! Angular 5

html - 在 React 的 onFocus 期间区分键盘和鼠标事件

reactjs - 使用 Jest 测试带有 Hooks 的 React 功能组件

typescript - 允许多个不同形状的接口(interface)作为 TypeScript 返回类型

reactjs - `TypeDefinition for React v15.0` 会与 React v0.14.7 一起使用吗

typescript - 是否可以更改 Playwright 中 toHaveScreenshot() 的路径?

javascript - 错误 TypeError : _v. context.$implicit.toggle 不是函数

javascript - 无法在 Ionic 3 应用程序中导入 Amplitude SDK