为什么通过泛型类型映射闭集不允许解析重复?

2023-12-12

In 这段 TypeScript 代码,也在下面重复,有一个映射类型

type DRYObjectModelMap = {
    [PlanetaryBodyClass in keyof FieldNameWithValueMap]: ObjectModel<PlanetaryBodyClass>
}

where keyof FieldNameWithValueMap = 'Moon' | 'Planet'但映射类型不会产生预期的等价物:

type ObjectModelMap = { //This requires more hard-coded repetition
    Moon: ObjectModel<'Moon'>;
    Planet: ObjectModel<'Planet'>;
}

使用这个预期的版本,甚至通过在映射类型中映射到它(将ObjectModelMap[PlanetaryBodyClass]冒号右侧)导致下面的错误消失,但也使代码更难维护,需要脆弱的重复。映射类型似乎旨在帮助避免这种重复的需要,但在本例中实际上并没有达到这一目的。

A 单独的问题解决了为什么在代码中添加带有多余条件的包装类型可能会意外地导致错误消失。

这可能是由于 TypeScript 中的一个错误造成的,尽管我在问题/PR 列表- 或者也许我只是不太了解这里发生的事情,无法使用正确的术语进行搜索或报告。 (如果您认为适当且不重复,请随时在那里提交新的错误报告)。


代码位于游乐场链接 is:

import BN from "bn.js";

//Simplified version of externally fixed model; many fields omitted for simpler example
type FieldNameWithValueMap = {
    Moon: [fieldName: "visibleStarsCount", fieldValue: BN] | [fieldName: "hostStar", fieldValue: string];
    Planet: [fieldName: "visibleStarsCount", fieldValue: BN] | [fieldName: "hostPlanet", fieldValue: string];
}
//type PlanetaryBodyName = keyof FieldNameWithValueMap; //'Moon' | 'Planet'; not used for simpler example
type TupleToObject<T extends [string, any]> = { [key in T[0]]: Extract<T, [key, any]>[1] };
type ObjectModel<T extends keyof FieldNameWithValueMap> = TupleToObject<FieldNameWithValueMap[T]>;
//Hovering over these two examples, the types are as expected; they need to be derived from imported types.
type MoonObject2 = ObjectModel<'Moon'>; //{visibleStarsCount: BN; hostPlanet: string;}
type PlanetObject2 = ObjectModel<'Planet'>; //{visibleStarsCount: BN; hostStar: string;}

type DRYObjectModelMap = {
    [PlanetaryBodyClass in keyof FieldNameWithValueMap]: ObjectModel<PlanetaryBodyClass>
    //The below works, but not the above, and requires the undesired hard-coded repetition
    //[PlanetaryBodyClass in keyof FieldNameWithValueMap]: ObjectModelMap[PlanetaryBodyClass]
}
type ObjectModelMap = { //This works in place of using DRYObjectModelMap, but requires more hard-coded repetition
    Moon: ObjectModel<'Moon'>;
    Planet: ObjectModel<'Planet'>;
}
type PickedAttributeSimpler<T extends 'Moon'> = DRYObjectModelMap[T]['visibleStarsCount'];
function genericFunction<
    T extends 'Moon', //union type that includes | 'Planet' omitted for simpler example.
    //Omitting the generic type parameter and hard-coding it into each usage below fixes the error,
    //but the real version of the function not oversimplified for the example needs to be generic.
>(
    PlanetaryBodyClass: T,
) : PickedAttributeSimpler<T> { //Same if using DRYObjectModelMap[T]['visibleStarsCount']
    return new BN(42); //ERROR TS(2322): Type 'BN' is not assignable to type 'PickedAttributeSimpler<T>'.
}
type ExamplePickedAttribute = PickedAttributeSimpler<'Moon'>; //This is type 'BN' as expected
type ExampleGenericPickedAttribute<T extends 'Moon'> = PickedAttributeSimpler<T>; //This is DRYObjectModelMap[T]['visibleStarsCount']
type ExampleGenericInstanceOfPickedAttribute = ExampleGenericPickedAttribute<'Moon'>; //This is BN as expected
type HoverToSeeHowTypeShouldResolve<T extends 'Moon'> = DRYObjectModelMap[T]['visibleStarsCount'];
type HoverToSeeHowTypeShouldResolveInstance = HoverToSeeHowTypeShouldResolve<'Moon'>; //This is BN as expected

None

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

为什么通过泛型类型映射闭集不允许解析重复? 的相关文章

随机推荐

  • Java 8 功能是否可用于 Java 绑定项目中的 Xamarin.Android?

    我有一个使用 Java 8 功能的 android 库项目 即通过 compileOptions sourceCompatibility JavaVersion VERSION 1 8 targetCompatibility JavaVer
  • 为什么 == 有时对 Java 中的字符串起作用? [复制]

    这个问题在这里已经有答案了 我有以下代码 Circle c1 new Circle Circle c2 new Circle System out println c1 c2 哪个输出False 正如预期的那样 这是因为c1 and c2是
  • Linux 在同一个 CSV 文件中将一列拆分为两个不同的列

    Closed 这个问题是无关 目前不接受答案 您好 我有一个包含以下条目的 csv 文件 11 22 13 aa bb cc ww kk ll 请建议我一个 Linux 命令或脚本 它可以在同一文件中将列分成 3 列 如下所示 11 aa
  • C# P\Invoke DLL 没有 C++ 的入口点?

    我有一个 C Dll TheFoo dll 其方法为 Foo 我只需调用以下命令即可访问使用此方法的其他 C 代码 Foo 我相信该方法确实具有 declspec dllexport 因此 根据我对 P Invoke 的阅读 我认为我应该能
  • PHP 替代控制结构有什么缺点吗?

    我一直在与PHP无需任何模板即可生成 HTML 的代码 而且其结构非常混乱且难以阅读 大幅改进我注意到的流程的一种方法是使用 endif代替 在某些情况下会阻塞以提高可读性 看http php net manual en control s
  • 适用于 Android 的 libjpeg-turbo

    I need libjpeg turbo对于安卓NDK 有人设法将其编译为 a 静态 lib 吗 我已经尝试了几次 但它只给了我很多错误 安装Android NDK 以下说明经过验证r8b 老版本可能有问题 我不知道 获取 Android
  • 如何在linux上运行aout?

    问题是如何在 Linux 系统上执行 aout format 二进制文件 我的意思是旧格式 例如在迁移到 ELF 之前在 FreeBSD 上使用的格式 是否有可能在没有额外编码的情况下做到这一点 是否有一些现有的解决方案 也许它应该是 Li
  • Laravel 8 - 外键约束的形成不正确

    我不知道出了什么问题 因为我对此很陌生 Product Model class Product extends Model use HasFactory public function store return this gt belong
  • Heroku —“很抱歉,出了点问题”

    嗨 我对 Heroku 还很陌生 我已经完成了我的应用程序的一部分 目前我在本地工作 但我想部署到 Heroku 当我打字时heroku logs我懂了 2012 07 30T16 36 27 00 00 app web 1 DEPRECA
  • 在 Firebase 中创建用户时出现错误

    所以我正在关注精明的应用程序教程以学习 Vue js 本教程使用 Firebase 和 Firestore 由于 Firestore 处于 Beta 阶段 正如教程所述 因此可能会发生变化 我认为这里可能就是这种情况 无论如何 我正在尝试注
  • 在 Sweave 中制作扁平化 pdf

    因此 我正在使用 Sweave 创建 pdf 其中包含一些带有大量点的图表 我可以很好地获取 pdf 但它似乎用大量图层创建了它 因此很难在 Acrobat 或 Reader 中打开该文件 当我这样做时 我确实可以看到文档上加载的点 有没有
  • Postgres 是否提供刷新缓冲区缓存的命令?

    你好 有时我需要做一些 SQL 调优任务 我通常在我的测试数据库上做这样的测试 当我执行一条sql语句后 我想刷新包含SQL的缓冲区缓存 语句和sql结果 就像Oracle中的命令 Alter system flash buffer cac
  • 如何添加和删除CSS类

    如何删除CSS默认类 这是我的div div 这是我的 css 类 messageContainer height 26px color FFFFFF BACKGROUND COLOR 6af VERTICAL ALIGN middle T
  • 身份管理/SSO 解决方案? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 您对基本的集中式身份管理 SSO 服务有何建议 它必须是开源的 具有可插入的身份管理器 例如 LDAP DB openID 等 并提供一系列适当的
  • 生成新的 Nestjs 模块会导致错误:无法执行命令

    我使用带有 M1 芯片的 MacOS monterey 作为操作系统 使用以下命令安装 NestJS cli sudo npm install g nestjs cli 使用创建新的 Nest 项目时nest new message一切正常
  • 使用 XSLT 合并相邻的兄弟节点

    我有一个问题让我头疼极了 请帮我 输入是 p class section section 1 p p class code some code p p class code following code p p class code fol
  • 如何在Javascript中深度复制(克隆)具有数组成员的对象?

    介绍 我有一个班级Persons包含一个数组Person和功能 function Persons this mItems Array of Objects Person Persons prototype calculateScores f
  • JavaScript 中未声明变量的用法

    如果我们尝试使用未声明但允许为其设置值的变量 为什么 JavaScript 会抛出引用错误 e g a 10 creates global variable a and sets value to 10 even though its un
  • 使用 Maven 运行多个类

    我有一个包含多个类的包 每个类都封装了一个可执行程序 即带有 main 方法 即 com myorg examples classA com myorg examples classB etc 所有类都属于同一个包 com myorg ex
  • 为什么通过泛型类型映射闭集不允许解析重复?

    In 这段 TypeScript 代码 也在下面重复 有一个映射类型 type DRYObjectModelMap PlanetaryBodyClass in keyof FieldNameWithValueMap ObjectModel