可选与未定义:如何检查可选属性

可选与未定义:如何检查可选属性

在 typescript 中,如果可以从对象中省略某个属性,则该属性被认为是可选的,这意味着它可以是未定义的,也可以是根本不提供的。可选属性使用 ? 表示属性键上的后缀。确定一个属性是可选的还是显式定义为 undefined 的类型可能非常棘手。

让我们考虑以下具有五种可能组合的示例:

type example = {    required: number;    optional?: number;    requiredasundefined: undefined;    requiredwithundefined: number | undefined;    optionalwithundefined?: number | undefined;}

登录后复制

最后四个属性允许未定义,但实际上只有第二个和第五个属性是可选的。有趣的是,可选属性、requiredwithundefine 和optionalwithundefine 都解析为相同的联合类型编号 |未定义.

所以,我们想要的是一个类型,对于可选和可选的带未定义返回 true,对于其余的返回 false。以下是此类实用程序类型的外观:

type isoptional = undefined extends t[k]    ? ({} extends pick ? true : false)    : false;type required = isoptional;  // falsetype optional = isoptional;  // truetype requiredasundefined = isoptional;  // falsetype requiredwithundefined = isoptional;  // falsetype optionalwithundefined = isoptional;  // true

登录后复制

此实用程序类型有两个限制。第一个约束 undefined extends t[k],检查 undefined 是否可以是 t[k] 访问的类型的一部分。它本质上询问类型 t[k] 是否可以包含 undefined。第二个约束,{} 扩展 pick ? true : false,确保类型 {} (空对象)可分配给选择属性 k 的类型,这意味着该属性是可选的。

从这个实用程序类型中,我们可以构建一个新的映射类型,它只选择可选属性。非可选属性将设置为 never:

type optionalproperties = {    [k in keyof t]: isoptional extends true         ? t[k]         : never}type onlyoptionals = optionalproperties;// type onlyoptionals = {//     required: never;//     optional?: number;//     requiredasundefined: never;//     requiredwithundefined: never;//     optionalwithundefined?: number | undefined;// }

登录后复制

拥有类型为 never 的属性通常足以保证类型安全,但如果我们确实想出于风格目的而省略这些属性,我们可以将 isoptional 将 true 约束扩展到方括号中。这是一个很好的小技巧,因为它将非可选属性的键设置为 never,然后 typescript 会自动忽略它。

type OnlyOptionals = {    [K in keyof T as IsOptional extends true ? K : never]: T[K]} type OnlyOptionals = OnlyOptionals;// type OnlyOptionals = {//    optional?: number;//    optionalWithUndefined?: number | undefined;// }

登录后复制

这里是直接在浏览器中尝试的 playground:typescript playground

以上就是可选与未定义:如何检查可选属性的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2672424.html

(0)
上一篇 2025年3月7日 13:26:00
下一篇 2025年3月7日 13:26:14

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • OOP 中的对象组合和抽象

    对象组合和抽象是 php 面向对象编程 (oop) 中的基本概念。 对象组成: 对象组合是一种对象由一个或多个其他对象组成的技术。这允许: 代码重用维护更方便更加灵活 在 php 中,对象组合是通过使用属性或方法将一个类包含在另一个类中来实…

    2025年3月7日
    000
  • JS:承诺还是回调?

    理解 javascript 中的 promise 与 callback 认证测试的关键问题和解答 什么是回调函数,它与常规函数有何不同? 回调函数作为参数传递给另一个函数并被调用来处理异步操作。与常规函数不同,回调被设计为在完成某个任务后执…

    2025年3月7日
    200
  • 了解 JavaScript 中的包、依赖关系和模块

    我注意到术语“包”、“依赖项”和“模块”存在一些混淆。让我们澄清这些概念,以帮助您在项目中正确使用它们。 包裹 包是捆绑在一起以提供特定功能的文件的集合。在 javascript 生态系统中,包通常通过 npm(节点包管理器)分发。一个包裹…

    2025年3月7日
    200
  • 什么是干净代码(JavaScript 版)

    无论你想怎么写,都可以编写只需要使用一次的代码。但是,在大多数情况下,遵守最佳实践和维护干净的代码至关重要。 请记住,您的代码稍后可能会被其他开发人员甚至您自己阅读。到那时,您的代码应该是不言自明的。每个变量、函数和注释都应该精确、干净且易…

    2025年3月7日
    200
  • 编码训练营编年史:本周亮点和经验教训

    你好,我是穆卡拉姆.我目前正在进行第 1 周的学习 Linux 和命令行编程,我发现它出奇的简单。 我之前有过一些基本道德黑客课程的经验,这有助于我更好地理解 Linux 命令。 这种熟悉感使得浏览命令行、创建和管理文件和目录以及执行系统任…

    2025年3月7日
    200
  • 我见过的关于 JS 中闭包的最简单的解释(来源:roadmapsh)

    想在这里分享我在网上看到的关于著名的闭包主题的最简单的解释。 (来源:roadmap.sh) 闭包是一个即使在外部函数返回后也可以访问其外部函数作用域的函数。这意味着即使函数完成后,闭包也可以记住并访问其外部函数的变量和参数。 functi…

    2025年3月7日
    200
  • Nextjs 获取数据时的缓存问题

    介绍 构建应用程序时 next.js 中常见的缓存问题是 next.js 的默认缓存行为,这导致许多开发人员感到沮丧。在很多情况下,缓存通过存储资源副本来帮助加速页面加载并减少服务器负载。 但是,它有时会导致显示过时的内容,这对于动态应用程…

    2025年3月7日
    200
  • webpack 公共路径

    publicPath 配置选项充当占位符,允许您动态调整静态资源的路径。 为了说明这一点,让我们考虑一下您已将静态资产(例如 commons.js)上传到 CDN 的场景。该文件的实际 URL 可能是: https://s1.cdn.com…

    2025年3月7日
    200
  • 值得一读的 JavaScript、TypeScript 和 Nodejs 书籍

    javascript 是一种在 web 上占据主导地位的编程语言,但它也被需要高级知识的不同领域广泛使用。除了其他基于 javascript 的技术,例如:typescript 和 node.js 在这篇文章中,我们将发现10 本值得一读的…

    2025年3月7日 编程技术
    200
  • 简化 JavaScript 中的调用、应用和绑定

    javascript 允许您使用调用、应用和绑定来更改函数的上下文(此值)。这些方法一开始可能看起来很棘手,但通过一些简单的示例和现实生活中的类比,您就会掌握它们的窍门。让我们来分解它们吧。 调用方法 将调用视为一种从一个对象借用方法并将其…

    2025年3月7日
    200

发表回复

登录后才能评论