打字稿限制对象属性的数量

2023-12-10

是否可以限制对象属性的数量,假设我想限制对象只有一个字符串属性(具有任何名称),我可以这样做:

{[index: string]: any}

限制属性的类型,但是可以限制属性的数量吗?


Stackoverflow 上这个问题有很多答案(包括这个详细的),但它们都不适合我的情况,这与此处发布的情况类似。

Problem

我有一个接受对象的函数。我想让它抛出一个编译错误(打字稿)如果传递的对象没有恰好一个键。例如

f({}); // Must error here, as it has less than one key!
f({ x: 5 });
f({ x: 5, y : 6 }); // Must error here, as it has more than one key!

Solution

使用流行的并集到交集 and IsUnion,我通过以下实用函数实现了它。

type SingleKey<T> = IsUnion<keyof T> extends true ? never : {} extends T ? never : T;

完整代码:

// From https://stackoverflow.com/a/50375286
type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends ((k: infer I) => void) ? I : never;

// From: https://stackoverflow.com/a/53955431
type IsUnion<T> = [T] extends [UnionToIntersection<T>] ? false : true;

// Here we come!
type SingleKey<T> = IsUnion<keyof T> extends true ? never : {} extends T ? never : T;

// Usage:
function f<T extends Record<string, any>>(obj: SingleKey<T>) {
    console.log({ obj });
}

f({}); // errors here!
f({ x: 5 });
f({ x: 5, y : 6 }); // errors here!

游乐场链接

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

打字稿限制对象属性的数量 的相关文章

随机推荐

  • 编辑源文件后,“make”不会重新编译

    我正在用 C 编写康威生命游戏的一个小实现 源代码分为三个文件 main c and functions c functions h 我在其中放置函数定义和声明 现在 为了创建单元格网格 我有一个这种类型的矩阵 Cell grid GRID
  • 什么时候可以检查文件是否存在?

    文件系统是易失性的 这意味着您不能相信一个操作的结果对于下一个操作仍然有效 即使它是下一行代码 你不能只说if some file exists and I have permissions for it open the file 你不能
  • 使用 Django Channels 的 Websocket

    我正在尝试使用 Django 通道与浏览器建立 websocket 连接 websocket与服务器连接失败 2017 01 23 23 51 50 HTTP GET 200 0 03 127 0 0 1 60445 2017 01 23
  • MySQL 可以在 LIMIT 语法之后执行子查询吗?如果没有,为什么?

    我的 MySQL 服务器版本为 5 1 53 我花了一个小时来自己回答这个问题 包括阅读文档本身http dev mysql com doc refman 5 1 en select html 目前 我运行此查询 SELECT dv2 ti
  • 您可以从您的应用程序锁定屏幕吗?

    是否可以通过应用程序锁定屏幕 即 就像按电源按钮一样 是的 我想你可以 看一眼那个锁屏类 你也看看相关类
  • 使用外部镜头、android 中的camera2 api 搜索焦点始终失败

    我正在为我的自定义相机使用camera2 api 我实现了触摸对焦 它运行良好 但是当我尝试连接外置镜头时 它找不到焦距 我必须尝试几次 原生相机即使与镜头配合也能完美工作 我还应该考虑什么 有什么意见吗 请指导 为了进一步使用 我最终使用
  • 如何在 Windows Core IoT 应用程序中显示当前时间的时钟?

    我正在尝试创建一个在 Raspberry Pi 2 上无头运行的 Windows 10 IoT 应用程序 一切都设置正确 我可以使用 Raspberry Pi 作为远程机器进行调试 从 Visual Studio 进行调试 现在我想在应用程
  • 构建android源代码

    我从 source android com 下载了 android 源代码 并按照说明在 MAC OS X 上设置构建环境 一切都很顺利 除了当我运行 make 时它给出了以下错误 PLATFORM VERSION CODENAME REL
  • 在 Winforms 自定义 UserControl 上启用设计界面

    我尝试在 C 中创建一个自定义用户控件来处理添加到其中的其他控件 自定义控件由两个面板组成 我想要实现的是 如果在设计模式下将另一个控件拖动到我的用户控件 或在运行时以编程方式添加 我希望将该控件放置在其中一个面板上 我尝试处理 OnCon
  • Dart 和客户端文件处理(经授权)

    服务器端应用程序需要对文件下载链接进行授权 这意味着正常 a 不再足以获取传递到服务器的足够参数 当尝试使用编程调用文件下载时 我将响应数据返回到 Dart 客户端应用程序 使用简单的 http GET var url http examp
  • Java List.stream.forEach Lambda 表达式内未处理的 IOException

    我正在使用 Java 8 中引入的 Stream API 为列表中的每个字符串运行一个方法 public boolean initFile throws IOException if this outFile exists this out
  • 编辑文件中的特定行

    我有一个这样的txt文件 shoes 12 pants 33 jacket 26 glasses 16 t shirt 182 我需要编辑夹克的数量 例如从 26 到 42 所以 我编写了这段代码 但我不知道如何编辑包含 jacket 一词
  • Blackberry webview 无法连接到互联网和/或显示网页

    我正在使用 Eclipse 和 Blackberry JRE 7 0 创建一个简单的应用程序 如下所示 http docs blackberry com en developers deliverables 11958 Configure
  • 未找到目标的伞标头

    关于堆栈溢出有答案 但没有一个对我有用 这是一个 Swift 2 0 项目 我使用的是 Xcode 7 2 1 重现问题的步骤 创建单一视图项目 转到项目导航器中的目标 添加一个名为 Common 的框架模块 添加另一个名为 Logger
  • 斜杠(“/”)是否等同于 HTTP URL 路径部分中的编码斜杠(“%2F”)

    我有一个网站可以治疗 and 2FURL 的路径部分 而不是查询字符串 中的情况有所不同 根据 RFC 或现实世界 这是一件坏事吗 我问这个问题是因为我不断遇到我正在使用的 Web 框架 Ruby on Rails 及其下面的层 Passe
  • 尾随零的数量

    我写了一个函数尾随零 n 中 返回数字的二进制表示形式中尾随零的数量 Example 4二进制是100 所以本例中的函数返回2 unsigned trailing zeroes int n unsigned bits bits 0 whil
  • Lucene 有快速、准确的荧光笔吗?

    我一直在使用 Java Lucene 荧光笔 在沙箱包中 一段时间 然而 当涉及到匹配搜索结果中的正确术语时 这并不是非常准确 它适用于简单查询 例如搜索两个单独的单词将突出显示结果中的两个代码片段 但是 它对于更复杂的查询表现不佳 在最简
  • Angular:从资产文件夹中读取所有文件

    tltr 我可以从角度访问资产目录吗 我的文件夹中有一堆 SVGsrc assets icons我使用的mat icon 唯一的缺点是当我添加新图标时 我必须添加文件 并且必须将文件名添加到一个数组中 我用该数组循环将其添加到matIcon
  • 如何使用星号等引导图标来给出星级评定?

    如何使用 Bootstrap 图标通过 css 或 jquery 给出星级评级 由于我被告知不要为此使用任何插件 因此我对如何更改星形图标的颜色以及如何使星形图标从起始星形到单击星形的颜色感到困惑 你实际上可以这样做PURE CSS 演示小
  • 打字稿限制对象属性的数量

    是否可以限制对象属性的数量 假设我想限制对象只有一个字符串属性 具有任何名称 我可以这样做 index string any 限制属性的类型 但是可以限制属性的数量吗 Stackoverflow 上这个问题有很多答案 包括这个详细的 但它们