打字稿检查类型 A === 类型 B | C型

2024-01-27

在一个文件中我有这样的内容:

export const _all = {
  a: '',
  b: '',
  c: '',
  d: '',
  e: '',
  f: '',
}
type AllKeysType = typeof _all;
export type AllKey = keyof AllKeysType;

在另一个文件中我有这样的内容:

export const _keep = {
  a: '',
  b: '',
  d: '',
  e: '',
}
type KeepKeysType = typeof _keep;
export type KeepKey = keyof KeepKeysType;

export const _ignore = {
  c: '',
  f: '',
}
type IgnoreKeysType = typeof _ignore;
export type IgnoreKey = keyof IgnoreKeysType;

如何使用 Typescript 来断言中定义的键_allALWAYS 等于并集_keep and _ignore。换句话说,AllKey应始终等于KeepKey | IgnoreKey.

我希望 Typescript 编译器在开发人员更新时给我一个错误_all通过添加一个新值(比如z)但忘记添加z进入任一_keep or _ignore.


这可以通过定义一个接受两种类型并解析为的条件类型来实现true当输入类型相等或false否则。然后编写一些代码,当该类型不是时会抛出编译错误true.

当任何一种类型发生更改时,您都会收到编译错误,这将确保您记住更新不同步的类型。当您想要收到有关不同库中类型更改的通知时,这尤其有用。

例如:

type IsExact<T, U> = [T] extends [U] ? [U] extends [T] ? true : false : false;
function assert<T extends true | false>(expectTrue: T) {}

// this will throw a compile error when the two types get out of sync
assert<IsExact<AllKey, KeepKey | IgnoreKey>>(true);

更健壮的代码会更长一些(例如处理any类型),但它已经在我的图书馆里了here https://github.com/dsherret/conditional-type-checks.

import { assert, IsExact } from "conditional-type-checks";

// define or import AllKey, KeepKey, IgnoreKey

assert<IsExact<AllKey, KeepKey | IgnoreKey>>(true);

另外一个选择

另一种不太好的方法是创建两种类型的两个对象并将它们分配给彼此。

() => {
  let allKeys: AllKey;
  let otherKeys: KeepKey | IgnoreKey;

  // do this in lambdas to prevent the first assignment from changing
  // the type of the variable being assigned to
  () => allKeys = otherKeys;
  () => otherKeys = allKeys;
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

打字稿检查类型 A === 类型 B | C型 的相关文章

随机推荐

  • 如何在leiningen项目中打包资源

    在示例项目中 https github com technomancy leiningen blob master sample project clj https github com technomancy leiningen blob
  • Anaconda提示加载错误:输入行太长

    我在 Windows 7 64 位版本上安装了 Anaconda 64 python 2 7 安装后 anaconda提示符可以正常启动 但是每当我重新启动 关闭并重新启动笔记本电脑时 anaconda提示符都会显示以下错误消息 并且某些p
  • 自动镜像 GitHub 存储库

    我怀疑这个问题以前曾被问过 尽管我能找到的都是相似但不同的问题 或者是相同的问题 但只有不适合我的解决方案 GitHub 上有一个我无法控制但想要镜像的存储库 对于镜像 我的意思是拥有一个自动更新的克隆 我希望这个镜像也能出现在 GitHu
  • 当使用 PHP 选择值“other”时,如何显示 HTML 输入字段

    我想弄清楚的是如何拥有一个 htmlinput当值为other从下拉菜单中选择 现在 下拉列表的值来自 MySQL DB 查询的结果 该查询有效 但我似乎无法弄清楚当我选择其他选项时如何显示输入 query mysql query SELE
  • Visual Studio 2015 + Xamarin + 本机便携式 PCL + WCF

    因此 我们的企业正在使用 Visual Studio 走 Xamarin 路线 浏览所有在线文档表明 从 Web 服务创建 WCF 代理客户端并将其放置在 PCL 中应该很简单 经过一番努力并试图找出为什么我无法使用 SLSVcUtil e
  • JavaScript使用变量的基本功能

    我目前正在 Codecademy 上学习 JavaScript 在那里 它给出了一个基本变量的示例 var divideByThree function number var val number 3 console log val 然而
  • C# 使用反射时确定 Nullable 属性 DateTime 类型

    我有一个关于如何确定对象的 Nullable 属性类型的问题 ObjectA有财产DateTime CreateDate 当我像下面的代码一样迭代它的属性时 如何检查属性是否是Nullable DateTime type foreach P
  • 在 PowerShell v3 中运行并行 Invoke-WebRequest 作业

    在 PowerShell 中运行同步后台作业非常简单 但我似乎无法让它与新的 v3 中 cmdlet Invoke WebRequest 一起使用 我正在通过 PowerShell 以脚本方式下载数千个文件 效果很好 但串联起来需要几天时间
  • 将计算列转换为常规列

    我在 SQL Server 2005 的一个大表中有一个持久计算列 我想将其转换为常规列 保留当前值 我是否必须重新创建列并更新事务中的整个表 或者是否可以仅更改计算列规范 以及如何操作 Create a new Column unpers
  • SCons 不会清除所有文件

    我有一个包含 builds 目录的文件系统 每个目录都包含一个名为 build info xml 的文件 然而 一些构建发生在构建脚本生成 build info xml 之前 因此在这种情况下 我有一个有点不平凡的 SCons SConst
  • execCommand insertHTML 中断存储的 window.getSelection()

    当使用在页面中选择文本和恢复所选文本的方法时 我发现运行execCommand insertHTML in Between 会导致存储的选择中断 这是如何选择和恢复文本的示例 Get Selection var sel window get
  • 将php文件加载到布局模板中?

    我正在开发我的第一个 php 网站 我遇到了一个我无法解决的问题 我试图拥有一个包含我的结构的 php 页面 以及其他在其中注入 html 的页面 同时保留 url 更改 以便我仍然可以直接链接页面 到目前为止 这就是我正在做的事情 但似乎
  • ggmap 具有值的热图

    谁能帮我制作 ggmap 热图 我的数据 val Qtd lt c 34 10 11 7 55 18 33 16 16 249 nom State lt c Distrito Federal Bahia Ceara Espirito San
  • 突出显示 Jupyter 单元中的部分代码

    有没有办法突出显示 Jupyter 单元格的某些行 类似于下图的内容 我用照片编辑器创建的 我的意思不是用光标进行选择 而是永久性的选择 例如 当您想要突出显示新添加的代码时 这对于演示文稿非常有用 下面提供的 Jupyter 笔记本扩展允
  • 当我不知道创建时的最大大小时,如何使用 Lucene 的 PriorityQueue?

    我为 Lucene Net 构建了一个自定义收集器 但我不知道如何对结果进行排序 或分页 每次调用 Collect 时 我都可以将结果添加到内部 PriorityQueue 中 我认为这是执行此操作的正确方法 我扩展了 PriorityQu
  • Objective C - 如果没有什么不同就使用访问器

    在目标c中 如果使用getter和直接访问ivar做完全相同的事情 getter中没有延迟加载代码 它所做的只是返回ivar 您是否仍然使用访问器或直接访问ivar 因为有没有不同 为什么 编辑 我说的是课堂内部 直接使用 ivar 会带来
  • JNI:从 C++ 到 Java 传递字节

    HANDLE hFile CreateFileA C myfile zip GENERIC READ 0 NULL OPEN EXISTING FILE ATTRIBUTE NORMAL NULL const int size GetFil
  • 如何强制执行父子结构的生命周期?

    我正在为外部 C 库编写包装器代码 并且试图说服 Rust 编译器强制执行 Rust 代码本身未反映的外部生命周期限制 例如 一种类型的 不透明句柄 可以返回仅在父句柄的生命周期内有效的子句柄 我尝试过std marker PhantomD
  • iOS 禁用键盘 Tab 箭头

    我需要使用 JavaScript 甚至基于 Web 的应用程序元标记 如果有 来禁用 IOS 上的键盘选项卡箭头 我尝试了一些选项 但在选择菜单时遇到了问题 我也无法将所有 tabindex 恢复为 1 因为这会损害桌面和其他设备上的选项卡
  • 打字稿检查类型 A === 类型 B | C型

    在一个文件中我有这样的内容 export const all a b c d e f type AllKeysType typeof all export type AllKey keyof AllKeysType 在另一个文件中我有这样的