如何扩展类型参数,使其仅允许字符串文字类型,而不允许“字符串”本身?

2024-05-24

我需要一个本质上是“除 {reservedKeywords} 之外的任何字符串”的类型。然而,这显然是要么不可能,要么棘手且笨拙 https://stackoverflow.com/a/63549561/1730082.

我可以满足于必须指定要使用的字符串文字。 这是我能得到的最接近我想要的,使用Exclude<T,K>:

type AnySet<set extends string> = set
let test1: Exclude<AnySet<"a" | "1">, "1">
test1 = "a" //passes correctly
test1 = "1" //fails correctly

let test2: Exclude<AnySet<string>, "1">
test2 = "a" //passes correctly
test2 = "1" //passes (counterintuitively :( )

有什么办法可以禁止通过string直接地? 此外,有没有一种方法可以将类型定义为任何字符串文字的集合,但不是特定的string?

这就是我的意思:

type AnySet<set extends string> = set
let test1: Exclude<AnySet<"a" | "1">, "1">
test1 = "a" //passes correctly
test1 = "1" //fails correctly

let test2: Exclude<AnySet<string>, "1">
test2 = "a" //passes correctly
test2 = "1" //passes (counterintuitively)

type FiniteSet<set extends ???> = set
let test3: Exclude<FiniteSet<"a" | "1">, "1">
test3 = "a" //should work
test3 = "1" //should not work

let test4: FiniteSet<string> //should fail
let test5: FiniteSet<"a" | "b" | "c"> //should work

您可以使用递归约束(所谓的F 界定量 https://en.wikipedia.org/wiki/Bounded_quantification#F-bounded_quantification) like S extends Exclude<string, S>:

type FiniteSet<S extends Exclude<string, S>> = S
let test3: Exclude<FiniteSet<"a" | "1">, "1">
test3 = "a" // okay
test3 = "1" // error

let test4: FiniteSet<string> // error
let test5: FiniteSet<"a" | "b" | "c"> // okay

这有效是因为the Exclude<T, U>实用型 https://www.typescriptlang.org/docs/handbook/utility-types.html#excludetype-excludedunion过滤联合体T删除任何可分配给U. If T is string那么输出将是string (if string不是 的子类型U) or never (if string是一个子类型U)。细绳文字类型 https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#literal-types是以下子类型string但反之则不然,这给出了您正在寻找的行为。

Playground 代码链接 https://www.typescriptlang.org/play?#code/C4TwDgpgBAggdiAyhYAeRUIA9gTgEwGcpDgAnASzgHMA+KAXikQFgAoAGxSl1IEYAXFACiWAMYcArvgip4SFKgBEAQyVQAPlCV8ltADTbdtdr2B9G2tVAD0NsCsKEIxMQHsyZCGOAcQpl3NLHXU7ADMVCg5XDy8fP3Z2LmAeQIAmIVEJaVl5ZDRSShoDIz0A0jTg6zsHJxcod09vX382M0qmENt7R2diAAp3SThcIuBJCmAKADcIPwBKRLbwaAAxKkmIfPRMHDwiEXEpGVRCqmpDRFp6JlZObjMAZkyjnNR1uE3t1XUtEJL-uVgI8qqEbIQABZuSQcfBQADuHgA1kCQZ1dN1IdDYVA4G4UoiyCi2EkHoEACxCD5fRRnYqYqEwuERKKklJmACsVI2uG+1j+ACNftoxHoGdi4YSkUA

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

如何扩展类型参数,使其仅允许字符串文字类型,而不允许“字符串”本身? 的相关文章

随机推荐

  • Laravel - 重复键批量插入更新大数据集

    我有大约 80k 条记录 每天需要多次运行插入 更新脚本 INSERT INTO my rankings id rank VALUES 1 100 2 99 3 102 80000 3 ON DUPLICATE KEY UPDATE ran
  • PowerShell Get-ChildItem 如何捕获异常

    我目前正在编写一个可视化错误 GUI 它可以在处理时捕获任何异常 并向用户提供 易于理解 的错误消息 但似乎我在使用时无法捕获任何异常Get ChildItemcmdlet 我是否必须使用与 try catch 不同的方法 这是 Power
  • 将“dplyr::across”与具有多个参数的函数一起使用

    我想知道是否有办法使用dplyr across一个需要多个参数的函数 如果没有 如何执行以下操作dplyr tidyverse library dplyr create a dataframe df lt structure list x1
  • 将平面数组拆分为分组子数组,其中包含输入数组中连续键的值

    我有一个数组array diff函数 如下所示 Array 0 gt world 1 gt is 2 gt a 3 gt wonderfull 5 gt in 6 gt our 正如您所看到的 键 3 和键 5 之间有一个间隙 即没有键 4
  • PowerBI区分空白值和0值

    有没有办法区分列中的空白值和列中的 0 值 当我使用 if 语句进行测试时 它们被视为相同的值 有什么建议吗 就在这里 在计算列中 首先测试值是否为空 然后测试是否为零 因此 创建一个标志并通过它过滤您的总和度量 即 No blanks s
  • 从 Excel 将参数传递到 SQL Server 上的 MS Query 中的临时变量

    我已经使用 Microsoft 查询创建了参数查询 如上所述here https superuser com questions 197453 run an sql query with a parameter from excel 200
  • WCF 缓存解决方案 - 需要建议

    我工作的公司正在寻求实施缓存解决方案 我们托管了多个 WCF Web 服务 并且需要缓存某些可以持久保存和获取的值 无论客户端与服务的会话如何 我正在研究以下技术 缓存应用程序块 4 1 使用 HttpRuntime 缓存的 WCF TCP
  • 基本矩阵错误?

    我试图通过扫描从相机拍摄的两个图像 检测图像中的特征 匹配它们 创建基本矩阵 使用相机内在函数计算基本矩阵 然后分解它以找到旋转和翻译 这是matlab代码 I1 rgb2gray imread 1 png I2 rgb2gray imre
  • 捕获数据包后会发生什么?

    我一直在阅读关于网卡捕获数据包后会发生什么的内容 我读得越多 我就越困惑 首先 我读过传统上 在网卡捕获数据包后 它会被复制到内核空间中的一个内存块 然后复制到用户空间 供随后处理数据包数据的任何应用程序使用 然后我读到了 DMA 其中 N
  • 不允许循环文件引用。发布 ASP.NET (2.0) 网站

    当我重新 构建 ASP NET 网站时 我没有收到任何错误 然而 当我发布该网站时 它给我一个 不允许循环文件引用 的信息 错误 我在网上读到了一些关于此的内容 它提供了一个batch false 选项 我尝试过但什么也没做 该页面有一个母
  • 我可以删除单个子实体而不加载整个集合吗?

    我有 2 个课程 如下所示 它们可以拥有非常大的集合 一个网站可能有 2 000 多个网站页面 反之亦然 class WebsitePage public int ID get set public string Title get set
  • 如何在 Android 中检查与配对设备的蓝牙连接状态

    我开发了一个蓝牙应用程序 它将连接到配对的设备并发送消息 但我必须先测试连接 我尝试了很多选择 但没有一个效果很好 那么您能给我发送任何可以做到这一点的代码示例吗 我创建了一个线程 但无法获得良好的连接状态来构建 if 函数 这是代码 pa
  • 获取 PHP 网站的根 URL

    我目前正在开发一个 PHP 项目 正在寻找一种方法来获取网站根目录的 URL 我的根目录有一个配置文件 所以我正在考虑使用它来找出 基本 URL 我正在寻找一种动态执行此操作的方法 以便我可以找到网站根目录的 URL 即http domai
  • 为什么我们应该在 Keras 中对深度学习数据进行标准化?

    我正在 Keras 中测试一些网络架构 以对 MNIST 数据集进行分类 我已经实现了一个类似于 LeNet 的方法 我看到在网上找到的例子中 有一个数据标准化的步骤 例如 X train 255 我在没有这种标准化的情况下进行了测试 我发
  • 如何更改mysql.sock?

    我已经通过二进制安装安装了mysql并按照以下步骤操作http dev mysql com doc refman 5 0 en binary installation html http dev mysql com doc refman 5
  • 使用 Python 的 optparse 模块时如何遵守 PEP 257 文档字符串?

    根据PEP 257 http www python org dev peps pep 0257 multi line docstrings命令行脚本的文档字符串应该是它的使用消息 脚本的文档字符串 a 独立程序 应该可用 作为其 使用 消息
  • 在 Android Studio 中设置 Http 代理

    我已经阅读了多个类似的问题和文档 但我无法解决我的机器所在的公司防火墙的问题 我收到的错误是 无法刷新 Gradle 项目 未知主机 services gradle org 我所阅读和理解的所有内容都让我相信这是一个 http 代理问题 我
  • angularjs ng-options从嵌套的json数组中选择

    我在我的范围内定义了一个 json scope People firstName John lastName Doe Choices Name Dinner Options Name Fish ID 1
  • 使用 Cheerio 选择具有属性的元素

    选择具有特定属性的所有 dom 元素的最有效方法是什么
  • 如何扩展类型参数,使其仅允许字符串文字类型,而不允许“字符串”本身?

    我需要一个本质上是 除 reservedKeywords 之外的任何字符串 的类型 然而 这显然是要么不可能 要么棘手且笨拙 https stackoverflow com a 63549561 1730082 我可以满足于必须指定要使用的