动态类型保护函数

2024-01-11

我想创建一个类型保护函数来检查对象中的特定键是否具有例如Astring价值。如果我知道键名,这很容易:

const data: object = { a: 'one', b: 'two', c: 'three' };

function hasStringKeyA(data: any): data is { a: string } {
    return typeof data.a === 'string';
}

if (hasStringKeyA(data)) {
    console.log(data.a);
}

但是当我需要检查更多密钥时,这会变得混乱:

if (hasStringKeyA(data) && hasStringKeyB(data)) {
    console.log([ data.a, data.b ].join(', '));
}

我想做的是:

if (hasStringKeys(data, ['a', 'b', 'c'])) {
    console.log([ data.a, data.c, data.b ].join(', '));
}

但我不知道如何编写可以通过这种方式参数化的类型保护函数。这是一个糟糕的尝试,但行不通:

function hasStringKeys <K extends string[]> (data: any, keys: Keys): data is { [ k: typeof K ]: string } {
    for (const key of keys) {
        if (typeof data[key] !== 'string') {
            return false;
        }
    }
    return true;
}

这可能吗?如何?


你已经很接近了。我将使用类型参数来捕获项目的字符串文字类型,而不是整个字符串数组。并且您需要使用映射类型而不是索引签名,您可以自己编写({ [ k in K ]: string })但是预定义的Record类型也应该有效:

const data: object = { a: 'one', b: 'two', c: 'three' };

if (hasStringKeys(data, ['a', 'b', 'c'])) {
    console.log([ data.a, data.c, data.b ].join(', '));
}

function hasStringKeys <K extends string> (data: any, keys: K[]): data is Record<K, string> {
    for (const key of keys) {
        if (typeof data[key] !== 'string') {
            return false;
        }
    }
    return true;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态类型保护函数 的相关文章

随机推荐

  • PHP:尝试让 fgets() 在 CRLF、CR 和 LF 上触发

    我正在使用 proc open 和 fgets stdout 读取 PHP 中的流 尝试获取传入的每一行 许多 Linux 程序 包管理器 wget rsync 仅使用 CR 回车 字符来表示定期 就地 更新的行 例如下载进度 我希望在这些
  • MVC ValidateAntiForgeryToken 多选项卡问题

    我们收到 未提供所需的防伪令牌或该令牌无效 的信息 错误 并且经过一些进一步的调查 我成功地以最简单的形式重新创建了问题 我要么做了完全错误的事情 要么这是防伪令牌系统的限制 不管怎样 我会很感激一些建议 空 MVC 2 项目 一个视图页面
  • 如何在 gemspec 中指定最低 Ruby 版本?

    我正在为新版本的 gem 编写 gemspec 现在需要 Ruby 1 9 以前版本的 gem 可以在 Ruby 1 8 上使用 但现在需要 1 9 有没有办法让这个版本的 gem 安装失败 并为尝试在 Ruby 1 8 上安装它的用户发出
  • /dev/mem 和 /dev/kmem 不存在?

    如果有人能解释一下为什么这两个文件不存在 我将不胜感激 如果没有这两个文件 Android内核的虚拟内存空间和物理空间会是什么样子 Edit I am having Android 2 3 7 Cyanogen mod the 2 file
  • 如何复制整个目录结构?

    我正在将 10 000 个文件从一个目录复制到另一个目录 两个目录结构都有相同的文件 但是 尺寸可能会有所不同 如何强制覆盖不同大小的文件而不复制相同大小的文件 到目前为止我有这个 source D Test1 destination D
  • 是否可以在 Hibernate / JPA 中动态定义列名?

    因此 我有一个现有的数据库模式 其中包含许多我想使用 JPA Hibernate 进行建模的表 每个 表具有同一组 30 个附加列 以允许运行时扩展字段数量 记录 CREATE TABLE XX ID VARCHAR2 100 BYTE N
  • 使用 ui-router 时控制器可以从父控制器继承范围吗

    我有以下内容 var admin name admin url admin views nav sub templateUrl Content app admin partials nav sub html controller funct
  • 如果一个表单字段有多个验证器,如何让play一一验证它们,而不是全部验证?

    我看到了一个登录表单 有一个name输入有许多验证器 object Users extends Controller val loginForm Form tuple name gt nonEmptyText 1 verifying Its
  • 是否可以查看对 Firebase 数据库所做的更改日志?

    我的一个 Firebase 对象被删除了 我试图弄清楚这种情况是什么时候发生的 Firebase 是否有日志显示更改发生的时间 有些人说这存在于 Analytics 中 但我无法找到它 提前致谢 火力战士在这里 没有可公开访问的日志来记录对
  • C ++ 提升绑定性能

    绑定函数 使用 Boost Bind 时是否会对性能产生任何影响 正面或负面 也许 也许不是 这取决于 的结果std bind 或者也boost bind 是所谓的 绑定表达式 它具有由实现确定的不可知类型 这种类型是一个Callable
  • 将一些 WooCommerce 产品数据传递到 Contact Form 7 查询表

    After 当 WooCommerce 中所选变体缺货时显示表单 https stackoverflow com questions 66405033 display a form when the selected variation i
  • 使用来自 URL 的 HTML 中的 .svg 文件?

    我正在尝试在我的 html 中使用来自外部源的 svg 假设我有这个 svg https upload wikimedia org wikipedia commons 0 09 America Online logo svg https u
  • 功能组件嵌套与 props

    我对 React 还很陌生 我有一个关于架构和设计模式的问题 我已经完成了我的第一个项目 交互式图灵机测序仪 http reactiveturing herokuapp com 如果有人感兴趣的话 我发现自己经常声明嵌套函数 例如 func
  • 如何验证Fragments中的EditText并防止Fragment更改?

    说明 我有一个片段活动FirstRun其中包括 5碎片 with 滑动导航 第二个和第三个片段包含 2编辑文本需要用户填写 并且不需要为空或未填写 好的 我可以使用 OnTextChanged 侦听器验证字段 但用户有可能只是滑到下一个片段
  • 选择项目时 onNavigationItemSelected 不调用

    我使用以下代码在导航抽屉中添加页脚视图
  • Python Threading.Event半忙等待的更好解决方案

    我正在使用非常标准的 Threading Event 主线程到达一个运行循环的点 event wait 60 另一个阻塞请求 直到有可用答复为止 然后启动 event set 我希望主线程选择 40 秒 但事实并非如此 来自 Python
  • 我们可以在 SQLite 数据库 (Android) 中存储 .doc .pdf 和 .jpg 文件吗?

    是否可以在 SQLite 数据库中存储像 pdf doc 这样的文件并再次成功检索它们 文件必须完整且再次可读 我知道我们可以存储图像文件 但对于上述情况 即使我们可以存储给定的最大文件大小是多少 好 去吧 将每个文件存储在数据库中比仅使用
  • 如何对 Java 小程序进行签名以便在浏览器中使用?

    我正在尝试在我的网站上部署 Java 小程序 我还需要签名 因为我需要访问剪贴板 我已经遵循了我能找到的所有签名教程 但没有取得任何成功 这是我到目前为止所做的 在 NetBeans 中编写了一个小程序 它在小程序查看器中运行良好 用它制作
  • 如何从BeautifulSoup4中的html标签中找到特定的数据属性?

    有没有办法仅使用 html 中的 data 属性来查找元素 然后获取该值 例如 在 html 文档中使用以下行 ul 我如何检索Sdafdo39通过在整个 html 文档中搜索具有以下内容的元素data bin属性 更准确一点 item d
  • 动态类型保护函数

    我想创建一个类型保护函数来检查对象中的特定键是否具有例如Astring价值 如果我知道键名 这很容易 const data object a one b two c three function hasStringKeyA data any