我可以将字符串文字映射到类型的类型吗?

2023-12-12

我有一个字符串文字类型,例如

type ConfigurationTypes = 'test' | 'mock'

和一些类型

type MockType = { id: string }
type TestType = { code: string }

我想创建一个将字符串文字“映射”到该类型的类型,这样如果ConfigurationTypes改变,我的类型MappedConfigurationTypes也将需要进行相应的改变。有可能吗?

type MappedConfigurationTypes: {[key in ConfigurationTypes]: any} = {
  test: TestType
  mock: MockType
}

从某种意义上说,您正在寻找类型级别satisfies操作员。如果你写e satisfies T where e是一些表达和T是某种类型,编译器将确保e is 可分配的 to T没有widening to T, so e保持其原始类型,但如果与以下内容不兼容,则会收到错误消息T。您想做同样的事情,但用另一种类型替换表达式。就像是

// this is invalid TS, don't do this:
type MappedConfigurationTypes = {
  test: testType; 
  mock: MockType
} Satisfies {[K in ConfigurationTypes]: any}

但没有这样的Satisfies类型运算符。太糟糕了。


幸运的是,我们基本上可以自己构建一个:而不是T Satisfies U,我们可以写Satisfies<U, T>(我正在制作“Satisfies U“注意的句法单位,所以这就是我想要的原因Satisfies<U, T>并不是Satisfies<T, U>。但您可以根据需要定义它)。

定义如下:

type Satisfies<U, T extends U> = T;

你可以看看如何Satisfies<U, T>将始终评估为T, 但是由于T is 受约束的 to U,编译器会抱怨如果T不兼容U.


让我们尝试一下:

type ConfigurationTypes = 'test' | 'mock';
type MockType = { id: string }
type TestType = { code: string }        

type MappedConfigurationTypes = Satisfies<{ [K in ConfigurationTypes]: any }, {
    test: TestType
    mock: MockType
}>    

看起来不错。如果您将鼠标悬停在MappedConfigurationTypes你看它相当于

/* type MappedConfigurationTypes = {
    test: TestType;
    mock: MockType;
} */

另一方面,如果您将另一个成员添加到ConfigurationTypes union,您将看到所需的错误:

type ConfigurationTypes = 'test' | 'mock' | 'oops'

type MappedConfigurationTypes = Satisfies<{ [K in ConfigurationTypes]: any }, {
    test: TestType
    mock: MockType,
}> // error!
//   Property 'oops' is missing in type '{ test: TestType; mock: MockType; }' but required 
//   in type '{ test: any; mock: any; oops: any; }'.

Playground 代码链接

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

我可以将字符串文字映射到类型的类型吗? 的相关文章

  • 打字总是抱怨全局模块

    我对打字稿很陌生 无论我尝试安装什么类型 我都会得到 打字错误 消息 尝试将 Angular 编译为外部模块 但它看起来像全局模块 我只是想做 typings install dt angular 我究竟做错了什么 Update 如果您对此
  • 错误:最终加载程序(./node_modules/awesome-typescript-loader/dist/entry.js)未返回缓冲区或字符串

    dockerhub构建dockerfile时出现此错误 错误 最终加载程序 node modules awesome typescript loader dist entry js 未返回缓冲区或字符串 我在网上搜索了各种解决方案 但没有找
  • Angular:扩展服务和传递参数

    我很难理解如何在 Angular 中扩展服务 我有一个连接到 Firebase 并执行各种常见任务 获取 设置 更新 列表等 的服务 我没有为我的特殊组件重写它 而是尝试扩展它 我的想法是我可以只传递路径的新部分 但这会引发错误 Canno
  • 为什么 React router v6 useParams 返回属性可能为“未定义”的对象?

    为什么要反应路由器 v6使用参数 https reactrouter com docs en v6 api useparams返回属性可能为 未定义 的对象 在下面的代码中 我的 IDE 指示const slug string undefi
  • Angular2 - 防止复选框被选中

    我有一个每行包含一个复选框的表 在表头中 我有一个Check All切换所有表格行框的复选框 我正在尝试实现一些逻辑 如果复选框的数量将超过特定限制 则显示错误并且不切换表行复选框或checkall盒子本身 有一个问题允许checkAll即
  • 指定枚举类型

    有枚举 enum Foo Bar should cause type error Baz Baz 可以为其指定类型以使其成为仅字符串枚举吗 如果您愿意 您可以执行以下操作 创建一个函数 要求其输入只有string 有价值的属性 const
  • 无法在 typeScript 和 Webpack 中使用 p5.js

    我有一个使用图书馆的项目p5 js https github com processing p5 js Details 我的 Webpack 配置是 const path require path module exports entry
  • 即使 WebPack 构建工作正常,VS Code 显示未找到模块

    我的 VS Code 说它找不到导入 即使我的 WebPack 构建仍然有效 这是进口 import as tf from tensorflow tfjs 以及来自 VS Code 的消息 找不到模块 tensorflow tfjs 您的意
  • 使用 vue-cli 服务时如何禁用 linting?

    我正在使用以下命令使用 vue cli 运行我的项目 vue cli service 服务 open 如何禁用所有 linting 目前每次保存时都会重新进行 linting 并且更改代码需要很长时间 我已经把 lintOnSave fal
  • 如何在 TypeScript 中声明私有抽象方法?

    如何在 TypeScript 中正确定义私有抽象方法 这是一个简单的代码 abstract class Fruit name string constructor name string this name name abstract pr
  • 如何找到所有带有某种装饰的类?

    在Java中 我们可以使用 类路径扫描 找到具有给定注释的所有类 我们如何在 TypeScript 中做类似的事情 有没有办法找到所有装饰有某种装饰的类 这是一个例子 它假设您有某种方式引用范围 这magical类装饰器创建一个名为的字符串
  • 在非 Angular 类中获取注入的依赖项

    我有当前的 和简化的 课程 export class NavigationItem constructor private router Router navigateTo this router navigate this id 我不想每
  • 如何在 Durandal 中为我的 shell 视图模型使用类?

    我正在查看 Hot Towel 模板 并试图让它在 TypeScript 中工作 但我在转换 shell 视图模型时遇到了问题 我正在尝试将其转换为 TS 对我来说更有意义的是它应该是一个类 而不是简单地导出如图所示的函数here http
  • 解析 TypeScript 类型中的 Promise

    这是一个延续关于解决返回类型的问题 https stackoverflow com questions 53174191 infering return type in a nested object with typescript I m
  • IE 11 的 Map(iterable) 替代方案

    不幸的是我必须支持IE11 我使用以下代码创建地图 已使用 entries 的 polyfill const map new Map Object entries array 但由于IE11不支持iterable构造函数中Map 是空的 我
  • 考虑使用“jsdom”测试环境

    我有这个简单的测试 import React from react import render from testing library react import Button from describe Button gt it rend
  • 在不同类型检查(tsconfig)上创建编译器错误

    有人可以解释为什么这不会引发错误吗 interface A id number const a A id 5 const testA boolean a 1 works but why interface B id number const
  • Javascript 对象属性名称

    在 C 中 可以将对象属性的名称作为字符串值获取 名称 对象 Property gt myProperty 这可以在 Javascript Typescript 中完成吗 Object Keys 是我找到的唯一东西 但它给了我所有的键 示例
  • 使用函数重载进行解构

    我正在尝试创建一个函数 该函数需要一对坐标或一个对象x and y属性并返回邻居列表 但由于某种原因 即使我检查了它的类型 我也无法解构该对象 interface Coords x number y number public getNei
  • Angular 4 中的箭头函数(Lambda 函数)

    我对lambda知之甚少 lambda表达式被视为一个函数 我们有很多方法可以做到这一点 这是我的简单功能TypeScript file byPan card1 card2 return card1 pan card2 pan 我在 HTM

随机推荐

  • 如何根据国家/地区更改日期格式

    我需要根据用户国家 地区更改 DD MM YYYY 标签的顺序 http en wikipedia org wiki Date format by country 我想要执行此操作的方法是创建一个国家 地区 日期格式表 并根据国家 地区选择
  • 将 numba 与 np.concatenate 并行使用效率不高?

    我在获取时遇到一些问题np concatenate有效地并行化 这是一个最小的工作示例 我知道在这里我可以总结a and b单独进行 但我专注于并行连接操作 因为这是我在项目中需要做的 然后我将对连接数组进行进一步的操作 例如排序 无论我在
  • Selenium C# - Chrome 驱动程序不会在无头模式下下载文件

    我正在使用 77 版 Chrome 来测试一些下载 但我不明白为什么它不允许在无头模式下下载文件 仅发生在无头模式下 这是我正在使用的代码 chromeOptions AddUserProfilePreference download de
  • 不使用内置类型和运算符的 Python 复数除法

    我必须实现一个名为ComplexNumbers它代表一个复数 我是不允许使用内置类型为了那个原因 我已经覆盖了运算符 add sub mul abs str 它允许执行基本操作 但现在我不得不覆盖 div 操作员 允许使用 我在用着floa
  • 在另一个指令中包含一个指令时,不会显示验证消息

    为了减少 html 验证的样板代码 我正在编写两个指令 一个用于模板 另一个用于验证 这两个指令都按预期工作 并且 angularjs 验证类确实附加到无效的输入标签 唯一的问题是我面临验证属于模板指令一部分的消息不会显示 笨蛋链接 问题似
  • 如何在使用 setTextIsSelectable 禁用触摸键盘后启用键盘

    我正在使用一个自定义应用内键盘 所以我需要禁用系统键盘 我可以这样做 editText setShowSoftInputOnFocus false 适用于 Android API 21 但是为了在 API 11 之前做同样的事情 我正在做
  • WPF/MVVM:将域模型集合委托给 ViewModel

    域模型集合 通常是 List 或 IEnumerable 是委托的到一个视图模型 这意味着我的 CustomerViewModel 有一个 List 或 IEnumerable 类型的订单集合 绑定控件无法识别列表中的任何更改 但对于 Ob
  • php mail() -> 垃圾邮件,有时甚至没有收到?

    我正在使用 php 的 mail 函数发送确认电子邮件 据我所知 电子邮件是通过 gmail 和其他方式接收的 我遇到的唯一真正问题是在将电子邮件发送到 Hotmail 或 Yahoo 帐户时 我在网上读过 很多人都建议PHP邮件程序 你们
  • Ruby 版本不在 rbenv 的 ruby​​-build 列表中

    我正在使用 Rails 4 2 并且想使用 rbenv 更新我的 Ruby 版本 我使用 Homebrew 安装 ruby build 无论我尝试更新多少次brew 当我运行时 Ruby版本2 1 3不会显示rbenv install li
  • 如何获取图片 URL 块? (谷歌地图)

    我正在研究如何生成自己的图像图块并像本示例一样放入服务器 该示例从以下位置加载图块http mt3 google com mapstt 但是如果我想要我的图像怎么办 var trafficOptions getTileUrl functio
  • Expression Blend 和 Visual Studio Render WPF 控件是否不同

    在我的 WPF 应用程序中 我使用 Expression Blend 设计了表单 令我惊讶的是 当我使用 Visual Studio 2008 加载解决方案时 渲染效果非常不同 更令人惊讶的是 当我运行应用程序时 生成的 UI 与 VS 和
  • 在gridview中隐藏分页号码?

    我试图隐藏显示在网格视图底部的网格视图上的分页号码 我使用下拉列表而不是这个点击次数 我怎样才能隐藏它们 请指教 根据MSDN 就这么简单 GridView PagerSettings Visible false
  • 为什么java中整数除法? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 据我了解 在Java中 如果我将两个整数相除 如果结果不是整数 则小数部分将被截断 并且我会从除法中得到整数结果 这对我来说毫无意义 我想知道我是否可以深入了解为什么 Java 是这样设计
  • 使用opencv和python抓取帧时如何保持恒定的FPS?

    我使用 OpenCV4 和 python 3 打开网络摄像头 抓取帧并将其显示在窗口中 就像提供的第一个代码教程一样here 然而 抓取不同的帧需要不同的时间 有时抓取需要 0 01 秒 有时需要 0 33 秒 这在窗口中显示帧时会产生滞后
  • Excel 互操作 - 如何停止“评估”数字(存储为文本)

    我想知道是否有人遇到过以下问题并对如何解决它有任何想法 我正在通过 Interop 将数据从 C 应用程序 NET 3 5 导出到 Excel 2003 其中一列存储一个看似数字的字符串值 也就是说它是一个以 0 开头的数字 例如00012
  • 在页面之间传递状态?

    我有一个包含两个页面的 Silverlight Windows Phone 7 应用程序 我想在它们之间传递一些重要的状态 数组或结构 我是否必须遵循将所有内容都打包到查询字符串中的 Web 模型 当所有页面和类都位于同一设备上 同一进程和
  • 简单的拖动物理原理,向左或向右移动时表现不同[重复]

    这个问题在这里已经有答案了 我的代码对于负速度的表现与对于正速度的表现不同 我正在尝试实现平台物理 玩家在 X 方向上有速度 当用户分别按下 A 或 D 时速度会增加或减少 或者当玩家与墙壁碰撞时设置为 0 为了模拟与地面的摩擦力 玩家的
  • 使用 Google Drive API 下载文件夹

    我在 Google Drive 上有一些数据 组织在文件夹中 我想将它们传播到其他服务器上 我有一些用于传播的脚本 但我需要从谷歌驱动器下载数据 有没有一种通过 Google Drive API 下载文件夹的方法 同时还能维护整个文件夹结构
  • 多个 WindowsBaloonTip / TrayTip 通知?

    如果您要使用下面的代码在通知区域中创建 TrayTips BaloonTips 您会注意到它只允许一条消息 然后会卡住并出错 代码取自here coding utf 8 from win32api import from win32gui
  • 我可以将字符串文字映射到类型的类型吗?

    我有一个字符串文字类型 例如 type ConfigurationTypes test mock 和一些类型 type MockType id string type TestType code string 我想创建一个将字符串文字 映射