Typescript 枚举作为指定对象中的键预期会出现错误,但没有

2023-12-13

在使用枚举作为对象键时,我遇到了 TS 的一些奇怪行为。 我期望 TS 错误,但事实并非如此,我不明白为什么。

enum List {
  sm = "sm",
  md = "md",
}

export interface Dictionary<T = any> {
  [index: string]: T;
}
export type OptionalDictionary<T, K extends string = string> = { [P in K]?: T };

type MessageType = Dictionary<string | null>;
type MessagesType = OptionalDictionary<MessageType, List>;
type Values = { receiver: List; text: string };

const values = { receiver: List.sm, text: "123" };
const { receiver, text } = values;

const data: MessagesType = {
    // [receiver]: { text }, // correct
    [receiver]: text // wrong, but no error
};

const data2: MessagesType = {};
// data2[receiver] = { text }; // correct
data2[receiver] = text; // wrong, had error

console.log(data[receiver] === data2[receiver]); // true

Sandbox


这看起来像是 TypeScript 中一些不幸行为的相互作用。

首先,联合类型的计算键一直扩展到string索引,就像主题一样微软/TypeScript#13948,一个长期存在的错误/限制。所以类型{[receiver]: text}被视为{[k: string]: string}而不是类似的东西{sm: string} | {md: string}。我不确定何时或是否会改变,但这就是正在发生的事情。

其次,索引签名(例如{[k: string]: string}始终被认为可分配给弱类型(具有所有可选属性的类型,例如{sm?: {text: string}, md?: {text: string}}),即使索引签名的属性类型与弱类型的属性类型不兼容!这是主题微软/TypeScript#27144,也被认为是一个错误。同样,不知道何时或是否会解决这个问题;它被列为“未来”。

这两个错误放在一起给你带来了你所看到的行为:你可以分配{[receiver]: text}到一个类型的变量MessagesType没有错误。这就是解释;不知道你应该做什么,除了可能去这两个 GitHub 并给他们一个?????

无论如何,希望有帮助;祝你好运!

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

Typescript 枚举作为指定对象中的键预期会出现错误,但没有 的相关文章

随机推荐

  • MySQL LEFT JOIN 带有 WHERE 子句的查询

    希望有人可以提供帮助 因为我很难理解如何正确查询 我有一个 Member 表和一个 Member Card 表 Member Card 有一个 Member 列 因此该卡与一个会员相关联 两个表都有一个 LastModifiedDate 列
  • 匹配名称的好算法?

    我正在开发一款手机应用程序 用于将联系人与 Facebook 帐户同步 所以基本上我有一个我的联系人姓名列表和我的 Facebook 好友列表 我希望获得两个列表之间的最佳匹配 当然 我可以自己写一些基本的东西 但也许有一种已知的算法可以得
  • ADT 23 不喜欢 NDK11

    Win7 x64 Eclipse Luna SR2 Android 工具 v23 0 7 我已经安装了 NDK r11 我试图将 Eclipse 指向D android ndk r11通过首选项窗口 但它说 不是有效的 NDK 目录 您需要
  • 在 PHP 中显示关联数组

    我正在尝试构建一个函数 该函数从数据库中提取信息并将其插入到 PHP 中的关联数组中mysql fetch assoc 并返回数组 以便另一个函数可以显示它 我需要一种方法来显示返回的关联数组 这应该是与第一个不同的函数 print r a
  • Fortran 到 C 库的链接器错误 - /usr/lib/libf2c.so:对“MAIN__”的未定义引用

    所以我在使用 fortran 到 C 库时遇到了一些麻烦 现在 在讨论这个问题之前 我可以告诉你 我不能像某些论坛网站所建议的那样使用 g2c 现在 解决问题 当我尝试编译一个非常大的项目时 我得到以下信息 from the makefil
  • 在 Python 中读取 .mat 文件

    是否可以在 Python 中读取二进制 MATLAB mat 文件 我看到 SciPy 声称支持读取 mat 文件 但我没有成功 我安装了SciPy版本0 7 0 但找不到loadmat method 需要进口 import scipy i
  • 如何将 xml 文件的“自定义工具”属性设置为 T4 文件?

    我们知道 asp net resx 文件有一个自定义工具用于生成一些 C 代码 ResX文件代码生成器 我有一个 xml 文件 我想将其自定义工具属性设置为T4 file 如何将 T4 文件绑定到 xml 文件 你可以这样做T4工具箱 在
  • 如何在ios中从Facebook SDK 4.0获取用户名

    如何获得username来自 iOS 中的 facebook sdk 4 0 IBAction LoginWithFacebook id sender if FBSDKAccessToken currentAccessToken self
  • C++ 中的编译器版本、名称和操作系统检测

    我需要使用 C 检测操作系统名称 编译器名称和编译器版本 因为我需要更改每种情况的设置 我怎样才能做到这一点 对于大多数编译器 您可以找到预定义宏的列表 VS http msdn microsoft com en us library b0
  • 在 Windows 上使用 Cygwin64 编译器和调试器为 C 设置 VS Code(错误:无法启动调试)

    我正在尝试将 VSCODE 设置为debugWindows 上使用 Cygwin64 的 C 程序 我使用了 stephw建议的配置 在 Windows 上使用 Cygwin64 编译器和调试器为 C 设置 VS Code 但它对我不起作用
  • 将 dplyr 查询保存到 dbplyr 中的不同架构

    我有一个 JDBC 连接 想要从一个模式查询数据并保存到另一个模式 library tidyverse library dbplyr library rJava library RJDBC access the temp table in
  • Plotly R:根据折线图中的不同线条更改悬停信息字体颜色

    我想更改一些折线图线的悬停信息字体颜色 但不是全部 这是一些与我的代码类似的代码 number lt rep c 00 01 02 each 4 animal lt rep c cat dog mouse each 4 year lt re
  • 按钮上的长文本会弄乱 GridLayout 行

    我有一个 GridLayout 用于承载多个按钮 按两列排序 所有按钮都有固定的高度和宽度 如果其中一个按钮包含太多文本 布局就会混乱 我希望布局能够正确维护行 无论按钮是否有太多文本 我将在稍后处理显示太多文本的情况 使用文本的自动大小
  • T/F:在过程中使用 IF 语句会产生多个计划

    在回应this问题 KM 说 如果您使用的是 SQL Server 2005 或更高版本 则可以使用 IF 在同一过程中进行多个查询 并且每个查询都会为其保存一个查询计划 相当于旧版本上的每个查询的过程 请参阅我的答案中的文章或此链接到正确
  • 如何在查询字符串中安全地包含密码

    是否可以在 C asp net 站点的查询字符串中安全地包含密码 我所知道的一些假设和事情 该网站没有也不会有与其他网站的链接 图像 javascript 分析 因此无需担心引用链接 与 Web 浏览器的所有通信都将通过 https 进行
  • 如何在Python中动态添加If Else语句?

    目前 我开发了一个脚本 该脚本将读取传入 最新的电子邮件并根据某些条件 例如电子邮件主题和文本 过滤电子邮件 当用户选择subject or text 他们可以选择要过滤电子邮件的条件 等于 不包含等 我的问题我有一个演示网站 可以让用户添
  • 如何阻止 X Window 接收用户输入?

    我想在 Linux 桌面上创建一些窗口以用于简单的布局 我需要避免用户输入到这些窗口 并且我认为避免窗口获得焦点就足以实现这种情况 我认为我可以用xprop命令 通过设置WM HINTS属性 但我还没有找到有关如何执行此操作的具体文档 顺便
  • Passport.js - 使用 Passport-local 对来自 MongoDB 的用户进行身份验证

    我的 MongoDB 中有一个简单的用户集合 我使用 mongo native 驱动程序 email email protected password 123456 id oid 50658c835b821298d3000001 当我通过电
  • 将参数传递给 main

    我知道这是相当基本的 但我仍然被困住 所以我有一个需要接受变量 n 的函数 所以这是我的主要函数 int main int argc char argv sort argv 1 我这样调用该程序 sort 4
  • Typescript 枚举作为指定对象中的键预期会出现错误,但没有

    在使用枚举作为对象键时 我遇到了 TS 的一些奇怪行为 我期望 TS 错误 但事实并非如此 我不明白为什么 enum List sm sm md md export interface Dictionary