从可区分联合属性到对象类型的映射

2024-02-15

我有一堆对象,它们都有一个属性来区分它们。我将它们作为联合类型。现在我想创建从可区分属性到实际类型的映射。我可以自己制作它,但它是两面性的并且容易出错,所以我想知道是否有某种方法可以使用 TypeScript 以编程方式生成它。 :)

type X = { type: "x", x: number }
type Y = { type: "y", y: number }

type Value = X | Y
type Type = Value["type"]

// Is it possible to generate this?
type TypeToValue = {
    x: X,
    y: Y,
}

// Its useful for stuff like this
function getRecord<T extends Type>(type: T, id: string): TypeToValue[T] {
    return null as any
}

如果签名始终与您帖子中的相同,而type必须匹配关联属性(例如x | y),你可以使用以下类型:

type TypeToValue<T extends Type> = { [P in T]: number } & { type: T }

可以按如下方式使用:

declare function getRecord<T extends Type>(type: T, id: string): TypeToValue<T>

const { type, x } = getRecord('x', 'aa');

没有办法从匹配的联合类型中获取对应的类型type争论。TS游乐场 https://www.typescriptlang.org/play/#src=type%20X%20%3D%20%7B%20type%3A%20%22x%22%2C%20x%3A%20number%20%7D%0D%0Atype%20Y%20%3D%20%7B%20type%3A%20%22y%22%2C%20y%3A%20number%20%7D%0D%0A%0D%0Atype%20Value%20%3D%20X%20%7C%20Y%0D%0Atype%20Type%20%3D%20Value%5B%22type%22%5D%0D%0A%0D%0A%2F%2F%20Is%20it%20possible%20to%20generate%20this%3F%0D%0Atype%20TypeToValue%20%3D%20%7B%0D%0A%20%20%20%20x%3A%20X%2C%0D%0A%20%20%20%20y%3A%20Y%2C%0D%0A%7D%0D%0A%0D%0A%2F%2F%20--%0D%0A%0D%0Atype%20TypeToValue2%3CT%20extends%20Type%3E%20%3D%20%7B%20%5BP%20in%20T%5D%3A%20number%20%7D%20%26%20%7B%20type%3A%20T%20%7D%0D%0A%0D%0Adeclare%20function%20getRecord%3CT%20extends%20Type%3E(type%3A%20T%2C%20id%3A%20string)%3A%20TypeToValue2%3CT%3E%0D%0A%0D%0Aconst%20%7B%20type%2C%20x%20%7D%20%3D%20getRecord('x'%2C%20'aa')%3B

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

从可区分联合属性到对象类型的映射 的相关文章

  • 在 Typescript 中创建动态变量引用

    提前感谢任何提供帮助的人 对于有经验的人来说 这似乎是一个简单的答案 但我已经浏览了互联网和几本参考书 并没有找到这个问题的直接答案 所以希望它也对其他人有帮助 我目前正在从 Actionscript 过渡到 Typescript 并且对普
  • TS1128:预期声明或声明(文件结尾)

    我正在开发一个 TypeScript React 项目 刚刚习惯它 已经一年没有写过 React 了 等等 并且遇到了一个问题 当我编写此组件时 我遵循了我找到的一些文档 但我在此文件末尾收到 TS1128 预期声明或声明 错误 我无法弄清
  • 与 webpack 捆绑后,无法读取枚举的未定义属性

    我有一个 React 库 我想使用 Webpack 来构建它 该库是使用 Typescript 编写的 似乎一切正常 但由于某种原因枚举却不起作用 当我将库安装到我的 React 应用程序中时 我发现Cannot read properti
  • Angular 12.1 使用 typescript 添加 html 元素

    我正在通过 youtube 学习 Angular 但我正在尝试做一些新的事情 但我遇到了一个错误 我的代码附在下面 请帮助我 我想这样设置属性div setAttribute click popUp event 但我得到了错误 打字稿 ex
  • 如何在 Angular 2 中处理 200 以外的 http 状态码

    现在我做http请求的方式 借用这个答案 https stackoverflow com a 34758630 4937981 这是 POST url data var headers new Headers authtoken local
  • 如何在 .tsx 打字稿中包含 .css 文件?

    如何在 tsx 中包含 css 文件以及如何使用它 即我如何渲染静态文件 import as React from react import Header from header import home css export class H
  • QUnit 不会运行测试

    我刚刚开始使用 QUnit 并遇到问题 我目前正在使用 TypeScript 它是一个 JavaScript 编译器 我在与我的主要课程结构平行的课程中进行测试 在每个类中 我都有一个名为 runTests 的函数 为了执行这些测试 我循环
  • 如何为 Angular 4、5 中的动态元素分配哈希 ID ref id

    如果我的问题很愚蠢 我很抱歉 我有 30 多个静态 ng container 和一些独特的静态 hashtagID 但我想在 ngFor 的帮助下动态创建它们 public lists food book cook 期望输出
  • “未知”与“任何”

    TypeScript 3 0 引入unknown根据他们的 wiki 输入 未知现在是保留类型名称 因为它现在是内置类型 根据您对未知的预期用途 您可能需要删除 完全声明 有利于新引入的未知类型 或者 将其重命名为其他名称 有什么区别unk
  • 打字稿标记的枚举获取值

    我在下面标记了枚举 enum PermissionEnum SU 1 lt lt 0 1 Administrator 1 lt lt 1 2 User 1 lt lt 2 4 对于给定值 6 我怎样才能得到 string gt 管理员 用户
  • 如何在 package.json 中对嵌套子模块和 TypeScript 使用“导出”?

    我想利用新的优势 出口 https nodejs org api packages html packages exportsNode js 的功能package json这样我就可以执行以下操作 exports dist index js
  • 在从命令行运行的 NestJS 脚本中使用服务

    我知道如何从命令行运行脚本 使用npm or npx ts node script ts 正如所述here https stackoverflow com questions 60704316 run nestjs script from
  • Angular 中的文件输入事件类型

    所以我已经使用 Angular 和 Typescript 很长时间了 我似乎无法找出输入文件的类型是什么 例如
  • 未强制执行 Typescript 抽象类静态方法

    我在 TypeScript 中有这个简单的代码 abstract class Config readonly NAME string readonly TITLE string static CoreInterface gt any cla
  • Angular 8 Native Typescript 无崩溃,访问器简写

    角8 我曾经在打字稿方面用作简短的黑客 object accessor accessor accessor to get object accessor accessor accessor 如果其中一个子级为空 则不会冒抛出错误的风险 根据
  • 想要动态处理与分页相关的页码显示:ReactJS

    我有一些分页逻辑工作得很好 唯一的问题是我只能让它显示并固定数量的页面可供选择 现在我已经把它放到了 5 页 但我希望它能够根据总记录动态更改 假设我有 100 条记录 每页限制为 10 条 将有 10 页 现在我只能让它以这种方式显示 第
  • 如何使用角度材料在具有可扩展行的表格中创建嵌套垫表

    我有以下数据 id c9d5ab1a subdomain wing domain aircraft part id c9d5ab1a info mimetype application json info dependent parent
  • 类型 {} 上不存在 Typescript 属性

    我有以下代码打字稿 为什么编译器会抛出错误 var object Object defineProperty object first value 37 writable false enumerable true configurable
  • 在 Angular 单个组件中导入第 3 方 javascript 库

    我目前正在开发 Angular4 应用程序 我想import some JavaScript 库 but 仅针对单个组件 目前我可以通过在里面定义它们的路径来轻松导入这个库 angular cli json像那样 scripts node
  • Typescript:隐式无参数函数类型

    我想要作为参数给出的函数的限定类型 我希望这种类型要么是一个没有参数的函数 返回一个包含参数的 void 函数 动作 要么是它返回自身的 void 函数 这是我想使用的代码 interface JsonArray extends Array

随机推荐

  • 从组件 ngrx 更改存储状态

    我正在使用选择器从商店中进行选择 this quizz this store select getSelectedQuizz 我使用异步管道从模板中的可观察对象中读取数据 ngIf quizz async let quizz 我只定义了操作
  • 如何使用c++获取文件夹中的所有图像

    我有个问题 我正在使用 openCV 库编写 C 我想获取文件夹中所有图像的数量 并且想加载文件夹中的所有图像以在 C 中进行处理 您可以使用glob http docs opencv org ref master db de0 group
  • Xcode_OSX/Swift_NSPopUpButton。

    我对此非常陌生 所以请记住这一点 我整晚都在这儿 看了无数视频 闹鬼 无数的论坛 我找不到一个答案 我正在尝试在 Swift OSX 中制作一个基本的弹出菜单我需要弄清楚的是 如何向此菜单添加 三项 以上的内容 无论在弹出窗口中选择什么 该
  • android-O:应用程序因 webview 崩溃

    我只是简单地放了一个WebView在布局中 当我在 Android O 预览模拟器中运行该项目时 出现以下错误 E AndroidRuntime FATAL EXCEPTION main Process com example mvvmre
  • 如何正确测量CUDA时间?

    我试图正确测量并行和顺序执行的时间 但我有疑问 因为 假设我们有以下代码 get the time clock t start finish double totaltime start clock double d A d B d X c
  • PL SQL 中多个参数的逗号分隔查询

    到目前为止 我可以在 PLSQL 中查询逗号分隔的 IN 参数 参考在 PL SQL 中使用逗号分隔的 IN 参数进行查询 https stackoverflow com questions 33126779 query with comm
  • json.dumps 和 json.load 有什么区别? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 有什么区别json dumps and json load 根据我的理解 一个将 JSON 加载到字典中 另一个加载到对象中 dumps h
  • 如何查找数组中所有出现的元素的索引?

    我试图在 JavaScript 数组中查找元素 例如 Nano 的所有实例的索引 var Cars Nano Volvo BMW Nano VW Nano I tried jQuery inArray http api jquery com
  • 使用 UTF8

    使用 std string 和 UTF8 似乎是一个相当复杂的问题 我找不到该做什么和不该做什么的很好的解释 如何在 C 中正确使用 UTF8 这是相当令人困惑的 我发现了boost locale我设置了全局区域设置 std locale
  • 如何在 MATLAB 中连接向量以创建非矩形矩阵?

    有没有办法创建非矩形矩阵 例如 如果我有一个矩阵a 6 8 10 和另一个矩阵b 1 5 我可以垂直连接它们以获得 6 8 10 排成一排并且 1 5 在另一个 直接的答案是no MATLAB 不支持参差不齐的或非矩形或非方阵 http e
  • ant junit 任务——在哪里下载 ant-junit.jar 并把它放在哪里?

    我实际上浪费了 2 个小时试图让 ant junit 任务正常工作 首先 我很难找到ant junit jar文件 但我设法在 Maven 页面中找到它 之后我把它放在几个地方 ant lib usr share ant lib 但运气不好
  • VueJs Typescript 忽略模板块中的 Typescript 错误

    在我的 VueJs 应用程序中 一切都按预期工作 唯一让我烦恼的是我的模板块中的打字稿错误 是否有类似于我在脚本块中执行的操作的选项
  • 如何从猫鼬数组中获取数据?

    我是 mongoose node js 和 mongoDB 的新手 我有一个像这样的数据库架构 Project projectName String projectManager String task taskName String ti
  • 如何在 Windows 上使用 cmd 查看屏幕亮度?

    我正在编写一个代码 可以根据用户输入更改屏幕亮度 但这是基于当前屏幕亮度的 有没有办法从命令提示符获取屏幕亮度的整数 过去我曾尝试使用 cmd 中的电源配置实用程序来执行此操作 但失败了 我尝试查找它 但没有找到任何适用于 Windows
  • 为什么或如何证明 JavaScript 数组相等?

    In 这个答案 https stackoverflow com a 8618383 7329有一个简单的函数可以返回包含原始值的数组的数组相等性 但是 我不确定它为什么有效 这是函数 function arrays equal a b re
  • Servlet 上的主机 IP 地址 0:0:0:0:0:0:0:1

    我正在尝试使用以下命令获取用户主机 IP 和端口 request getRemoteHost request getRemoteAddr request getRemotePort 但我得到 Host 0 0 0 0 0 0 0 1 IP
  • 如何在 Swift 中循环遍历 数组的元素

    我是 Swift 新手 想要循环遍历一系列MKMapPoints
  • Python/Flask:如何判断用户在页面上花费了多长时间? (数据输入/时间记录应用程序)

    我已经看到了使用 Javascript 查看用户在页面上花费多长时间的答案 但我缺乏 JS 知识 更不用说将 JS 集成到我的 Python Flask 框架中 我的目标是创建一个 Web 应用程序 用户可以在其中输入数据 同时记录执行任务
  • gmail 正在修改传入邮件的标头(消息 ID)

    我从我的 smtp 服务器发送了一封邮件到 gmail 我得到的消息 ID 是 消息 ID SMTPIN ADDE 电子邮件受保护 cdn cgi l email protection gt X Google 原始消息 ID Gmail 在
  • 从可区分联合属性到对象类型的映射

    我有一堆对象 它们都有一个属性来区分它们 我将它们作为联合类型 现在我想创建从可区分属性到实际类型的映射 我可以自己制作它 但它是两面性的并且容易出错 所以我想知道是否有某种方法可以使用 TypeScript 以编程方式生成它 type X