如何从类型中省略属性?

2024-06-24

我对 Typescript 中的 Omit 类型有疑问,所以我知道 Omit 类型与Pick并且是这样构建的:

type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>

但我不知道如何构造 Omit 类型。我有一个界面Student看起来像这样:

interface Student { 
name: string, 
surname: string, 
age: number, 
email: string 
}

我需要一个函数,它将学生作为具有某些给定属性的输入并输出省略的学生。该函数应如下所示:

let omit_student = <K extends keyof Student>(student: Student, ...props: K[] ): Omit<Student, K> => null!

但我不知道如何动态地省略 Student 给定的属性以及函数体内应该发生什么。

像这样调用该函数:omit_student(student1, "name", "age")应输出以下类型:

{ 
surname: string, 
email: string 
}

TypeScript 中的对象类型不是一个常见的混淆来源exact(按照要求女士/TS#12936 https://github.com/Microsoft/TypeScript/issues/12936)。类型的值Student is known具有name, surname, age, and email适当类型的属性,但不知道有only这些属性。这可以让您extend https://www.typescriptlang.org/docs/handbook/2/objects.html#extending-types通过向其添加已知属性来类型:

interface Student { 
    name: string, 
    surname: string, 
    age: number, 
    email: string 
}

interface HogwartsStudent extends Student {
    house: string,
    spells: string[]
}

上式中,一个HogwartsStudent是一种特殊类型Student。如果我给你一个Student,你不知道她是not a HogwartsStudent,所以你不能确定她没有house or spells财产。

The Omit<T, K>类型别名产生一个超类型 of T。那是,T延伸Omit<T, K>。每个类型的值T也是一个类型的值Omit<T, K>。你所“省略”的一切Omit<T, K>是已知的属性存在和类型,其中的键为K.


您要求的不仅是从类型中删除已知的键,而且是从生成的对象中删除实际属性。这需要在运行时发生,就像在 JavaScript 中执行的方式一样:

function omit_student<K extends Array<keyof Student>>(
  student: Student, ...props: K): Omit<Student, K[number]> {
    const newStudent: Omit<Student, K[number]> = Object.assign({}, student);
    for (let prop of props) {
        delete (newStudent as any)[prop];
    }
    return newStudent;
}

请注意,我使用了剩余元组类型 https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-0.html#tuples-in-rest-parameters-and-spread-expressions为了K参数,但你也可以按照你的方式来做。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从类型中省略属性? 的相关文章

随机推荐

  • 从 aws Glue 脚本调用存储过程

    ETL 作业完成后 在 AWS Glue 脚本中调用存储过程的最佳方式是什么 我正在使用 PySpark 从 S3 获取数据并将其存储在临时表中 在这个过程之后 需要调用一个存储过程 该存储过程将数据从临时表加载到相应的 MDS 表中 如果
  • Firebase Cloud Function:multipart/form-data 出现“意外的表单结束”错误

    我正在尝试在我的 Cloud Function Express 应用程序上创建文件上传路由 我尝试过不同的模块 例如formidable multer and busboy 但是在使用 firebase 模拟器运行服务器时 没有一个可以逃脱
  • J=1 且 W=Majority 的 MongoDB 副本集上是否仍会发生回滚?

    我一直在阅读文档 根据我的理解 我可以看到仍然可能发生回滚的情况 写入到主数据库 确认日志已写入磁盘 大多数辅助节点确认写入但不写入磁盘 整个集群断电 当电源恢复时 主设备由于某种原因无法启动备份 次要角色扮演主要角色 最初的主节点最终启动
  • MySQL 转储 CronJob

    我正在尝试创建一个 cron 来每天备份我的 MySQL 从站 backup sh内容 bin bash Backup mysql from slave sudo mysql u root p xxxxx e STOP SLAVE SQL
  • Android ListView 复选框选择

    我在这里有一个由两部分组成的问题 1 如何填充我的ListView以便显示字符串 但是当选择项目时 不可见的id值 来自手机联系人的联系人id 是实际使用的值 2 我有一个使用 multipleChoice 模式进行项目选择的 ListVi
  • Node.js 中的 Python 多处理 - 在子进程上打印不起作用

    我有一个运行客户端界面的 Node js 应用程序 该界面公开触发机器学习任务的操作 由于在实现机器学习相关内容时 Python 是更好的选择 因此我实现了一个按需运行机器学习任务的 Python 应用程序 现在 我需要集成这两个应用程序
  • MongoDB list集合过滤器

    我正在使用 Node js 我正在尝试过滤必须排除集合 出口 的集合并检索所有其他集合 但我似乎无法弄清楚语法 我试过了 db listCollections filter outlets toArray err docs 有什么建议么 您
  • 如何将位图转换为文件而不压缩

    我需要从服务器下载图像并以其原始质量保存 但显然保存后图像被压缩并且质量下降 我使用 android async http 库来处理 http 请求 我的请求和保存文件的代码 AsyncHttpClient client new Async
  • 从 WPF 窗口中删除图标

    我可以使用 WinApi 从 WPF 窗口中删除窗口图标 但是当我仅运行 WPF 项目的可执行文件时 我会在应用程序窗口中再次获得该图标 如何删除该图标 From WPF教程 http www wpftutorial net RemoveI
  • 构建表达式树

    我正在努力思考如何为更多 lambda 构建表达式树 如下所示 更不用说可能有多个语句的东西了 例如 Func
  • Python语法错误:无法分配给模块中的运算符,但可以在解释器中工作

    我有一根绳子a我想根据它的长度将它分成两半 所以我有 a front len a 2 len a 2 这在解释器中工作正常 但是当我从命令行运行模块时 python 给了我一个SyntaxError can t assign to oper
  • 如何使 Cucumber 功能作为本地单元测试在 Android 项目中运行?

    我有一个用 Java 编写的 Android 项目 正在 Android Studio 中进行 我想使用 Cucumber 对一些内部组件进行集成测试 注意 我知道这不是 BDD 方式 但对我来说很有用 我希望测试运行为本地单元测试 htt
  • WSO2 Identity Server 5.0.0 无法从辅助用户存储中为用户返回 SAMLResponse 中的用户声明

    我在使用 SAML SSO 身份验证时遇到此问题 我已经成功设置了 WSO2IS 5 0 0 身份服务器 我还成功设置了 至少我希望如此 辅助用户存储 我使用 JDBCUserStoreManager 实现 我已将此商店设置为 DOMAIN
  • 微服务中的事务

    我读过一些关于微服务架构的文章 但没有人涉及事务的主题 他们都说这很难做到 也许有人可以描述如何处理这个问题 但不是从领域方面 而是从技术方面 假设我们有一个业务案例 我们需要调用两个不同的服务 并且它们都对数据库进行一些更改 但是如果第二
  • 如何从存储在 char* 指针中的 name 调用 c 函数?

    我想通过函数的名称动态调用函数 例如 假设有以下函数和字符串 void do fork printf Fork called n char pFunc do fork 现在我需要打电话do fork 就在 pFunc 那么这可能吗 欢迎 C
  • SQL Server 2005 中的分层查询

    早在我在 Oracle 商店工作时 我就认为 CONNECT BY 是理所当然的 现在我一直在使用 SQL Server 2005 并且有一些令人讨厌的对象层次结构 具体来说 我们有一个自引用表 其中所有子记录都有一个包含其父记录 ID 的
  • 如何为复杂的印度尼西亚电话号码格式构建正则表达式?

    最近 我正在使用regexpal http regexpal com构建这个自定义正则表达式 我正在处理印度尼西亚电话号码的几个测试用例 这是一个简单的例子08xx 3456 7890 or 08xx34567890 但如果我得到以下格式
  • 像 String#replace 一样替换 Ruby 中引用的 Integer 值

    我有以下代码 def mymethod a a replace a end mystring b mymethod mystring p mystring gt a 但我想用 Integer 执行相同的操作 那可能吗 简短的回答 不 长答案
  • 尝试在另一个线程wxpython中创建一个对话框

    我正在另一个线程中运行一个函数 该函数应该填写一个对话框 然后显示它 但只要我尝试以任何方式更改对话框 它就会出现段错误 我读到这是 WxPython 的一个常见问题 并且开发人员无意直接更改另一个线程中的对话框 我该如何解决这个问题 我可
  • 如何从类型中省略属性?

    我对 Typescript 中的 Omit 类型有疑问 所以我知道 Omit 类型与Pick并且是这样构建的 type Omit