Typescript:具有排除更改属性修饰符的映射类型

2024-05-23

当使用 Minus 映射类型时,它似乎从属性中删除修饰符。我认为这是由排除类型引起的,但我不确定为什么。

我期望 Minus 只从 T 中删除 U 的键,而不更改 T 的属性修饰符。

type Minus<T, U> = { [P in Exclude<keyof T, keyof U>]: T[P] }
type Noop<T> = { [P in keyof T]: T[P] }

interface Student {
  readonly gpa: number
  hobby?: string
  name: string
}

interface Person {
  name: string
}

type Difference = Minus<Student, Person>
// type Difference = {
//   gpa: number; <-- Where did readonly go?
//   hobby: string | undefined; <-- Why is it no longer optional? It seems to have picked up '| undefined' though...
// }

const test1: Difference = { gpa: 4 } // <-- Error: property 'hobby' is missing

type NoopType = Noop<Student>
// type StringsOnly = {
//   readonly gpa: number;
//   hobby?: string | undefined;
//   name: string;
// }

const test2: NoopType = { gpa: 4, name: "bob" } // OK

Typescript 将保留同态映射类型的修饰符,如所述here https://github.com/Microsoft/TypeScript/pull/12563,但基本思想是,如果类型具有以下形式,则保留修饰符{ [P in keyof T]: T[P] }或类似的东西。在您的情况下,编译器不会将映射类型识别为同态,因为Exclude<keyof T, keyof U>我很确定这个限制已记录在某处,但我目前无法找到它。解决这个问题的简单方法是使用额外的间接方法Pick例如:+

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

Typescript:具有排除更改属性修饰符的映射类型 的相关文章

随机推荐

  • use 语句顺序会影响 PHP 中的功能吗?

    我使用 PHP 的命名空间已经有一段时间了 我认为它对我的编程来说是一个很好的补充 今天早上我想知道一些关于use陈述 我想知道顺序是否use影响我的 PHP 代码的功能 根据 PHP net 使用别名引用外部完全限定名称或导入的能力是命名
  • 如何在MaterialApp主题中设置fontSize的MediaQuery textScaleFactor

    我想在 MaterialApp 主题内设置 MediaQuery 以便在用户更改设置时 FontSize 尊重用户设置 我尝试创建最终的curlScale MediaQuery of context textScaleFactor 并相应地
  • 使用 JDBC 获取 Oracle 11g 的最后插入 ID

    我是使用 Oracle 的新手 所以我将放弃之前已经回答过的内容这个问题 https stackoverflow com questions 3131064 get id of last inserted record in oracle
  • NTFS 连接与符号链接(对于目录)[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 从高层次的角度来看 意味着只关心结果和接口 而不是实现 指向目录的 NTFS 重解析点和指向目录的符号链接之间的行为 如果有的话 有什么区别 同一目录
  • Python - 测试抽象基类

    我正在寻找测试抽象基类中定义的方法的方法 最佳实践 我能直接想到的一件事是对基类的所有具体子类执行测试 但有时这似乎有些过分 考虑这个例子 import abc class Abstract object metaclass abc ABC
  • Visual Studio 2010 的“线程”窗口中的 和 [Thread Destroyed] 详细信息

    我一直在尝试调试与一个应用程序的线程相关的一些问题 当我附加到应用程序时 我看到一个像这样的窗口 这个名为 Thread Destroyed 的线程是什么 应用程序代码肯定不会写这个名称 这意味着线程的调用堆栈不可用 采集引擎 线程在应用程
  • Javascript 闭包 - 变量范围问题

    我正在阅读 Mozilla 开发者网站上有关闭包的内容 我注意到在他们的常见错误示例中 他们有以下代码 p Helpful notes will appear here p p E mail p
  • 在 gui 中更新 matplotlib 图的有效方法?

    我的应用程序以大约 30fps 的速度通过网络接收数据 并且需要根据这些新数据动态更新水平条形图 为此 我在 tkinter 窗口内使用 matplotlib 图 对我的代码进行分析表明 我的代码中的主要瓶颈是该图的更新 下面给出了代码的简
  • NoInitialContextException:heroku 战争部署

    我一直在开发一个 J2EE 项目 并且在其中使用连接池 也通过部署在 heroku 上的数据库进行访问 我使用以下代码来设置 Connection 对象 Context initContext new InitialContext Cont
  • 使用 WebClient 在 PowerShell 脚本中将 FTP 从二进制更改为 ascii

    简单的 PowerShell 脚本 它可以毫无问题地下载文件 二进制 我需要它的ascii 格式 File c temp ftpfile txt ftp ftp myusername email protected cdn cgi l em
  • CSS 样式在部分回发时停止工作

    在 ASP net C 应用程序中 我有一个带有自定义 css 的复选框 CSS 文件是 复选框
  • 在node.js 0.12.x中使用libuv函数

    我写了一个node js c 插件 在node js 0 10 x下可以成功编译 但是当迁移到0 12 x时 出现了一些错误 例如error C2065 uv work t undeclared identifier 我想知道我是否可以在0
  • 如何在 IE 中启用开发者工具始终开启

    如何在 IE 中始终启用开发人员工具 每次我设置启用开发人员工具 通过菜单或按 F12 时 以前的设置 例如网络捕获 分析器打开 都会重置为默认值 但 Firebug 的情况并非如此 是否有任何注册表设置可以始终启用 IE9 IE10 中的
  • INotifyPropertyChanged 和线程

    我有一个基类实现INotifyPropertyChanged protected void OnNotifyChanged string pName if PropertyChanged null PropertyChanged this
  • 设置 Wpf 饼图样式

    这是我的饼图 xaml
  • 验证服务是否被标记为删除

    有时 当我卸载安装程序 使用 WIX 创建的 时 服务仍标记为删除 用户必须重新启动计算机才能再次安装 我如何验证该服务是否已标记为删除并告诉用户在进行其他安装之前重新启动计算机 一般来说 当某项服务仍然锁定在该服务上 从而阻止 Windo
  • 使用 PHP 更新 XML 节点

    我有一个 XML 文件 test xml
  • 如何在android中显示对话框之外的图像?

    我试图在对话框片段的顶部显示配置文件图像 一半在图像之外 我在下面附加了示例对话框 就像那样 并尝试了旧 Stackoverflow 解决方案中的所有 FrameLayout 协作 但我无法存档此内容 请给我正确的解决方案 谢谢 Updat
  • R:适合显示具有倾斜计数的数据的图

    我有这样的数据 Name Count Object1 110 Object2 111 Object3 95 Object4 40 Object2000 1 因此 只有前 3 个物体的计数较高 其余 1996 个物体的数量少于 40 个 其中
  • Typescript:具有排除更改属性修饰符的映射类型

    当使用 Minus 映射类型时 它似乎从属性中删除修饰符 我认为这是由排除类型引起的 但我不确定为什么 我期望 Minus 只从 T 中删除 U 的键 而不更改 T 的属性修饰符 type Minus