TypeScript 依赖的字符串文字属性和索引

2024-02-06

如同Typescript:属性的类型依赖于同一对象中的另一个属性 https://stackoverflow.com/questions/56949513/typescript-type-of-a-property-dependent-on-another-property-within-the-same-obj我想要一种属性相互依赖的类型。

const attributes = {
    physical: {
        traits: {
            strength: 1,
            dexterity: 1,
            stamina: 1,
        }
    },
    social: {
        traits: {
            charisma: 1,
            manipulation: 1,
            appearance: 1,
        }
    },
    mental: {
        traits: {
            perception: 1,
            intelligence: 1,
            wits: 1,
        }
    }
};

type AttributeTrait =
    | {
        category: 'physical';
        trait: keyof typeof attributes.physical.traits;
    }
    | {
        category: 'social';
        trait: keyof typeof attributes.social.traits;
    }
    | {
        category: 'mental';
        trait: keyof typeof attributes.mental.traits;
    };

const action: AttributeTrait = {
    category: 'social',
    trait: 'manipulation'
}

function increment(action: AttributeTrait) {
    attributes[action.category].traits[action.trait]++; // error 7053
}

在函数中,action.trait键入为:

(属性)特质:“力量” | 「灵巧」| “耐力”| “魅力”| “操纵”| 「外观」| 「感知」| 「情报」| “智慧”

所以它不能用于索引traits.

我该如何解决这个问题?


我没有为您提供非冗余且类型安全的解决方案。你的AttributeTrait我一直称之为相关记录类型 https://github.com/microsoft/TypeScript/issues/30581。这是一个可区分的联合体,其中某些代码对于联合体的每个成员都是安全的,但编译器无法看到它对于整个联合体来说是安全的,因为它失去了对联合体的跟踪。相关性在。。之间category and trait特性。

如果编写冗余代码,错误就会消失:

function incrementRedundant(action: AttributeTrait) {
    switch (action.category) {
        case "physical":
            attributes[action.category].traits[action.trait]++;
            return;
        case "social":
            attributes[action.category].traits[action.trait]++;
            return;
        case "mental":
            attributes[action.category].traits[action.trait]++;
            return;
    }
}

但是,无论您如何尝试,您都无法将这些情况折叠成一行代码并让编译器为您验证安全性。这就是我提交的原因微软/TypeScript#30581 https://github.com/microsoft/TypeScript/issues/30581,以及我提交的原因之一微软/TypeScript#25051 https://github.com/microsoft/TypeScript/issues/25051。因为你不能要求编译器处理单行as if它被写在一个switch/case声明,我能想到的最好的办法就是使用类型断言 https://www.typescriptlang.org/docs/handbook/basic-types.html#type-assertions告诉编译器你比它更了解。

做到这一点的一种方法是撒一点谎并告诉编译器:attributes实际上拥有所有trait全部category对象:

function increment(action: AttributeTrait) {
    (attributes as
        Record<AttributeTrait["category"], {
            traits: Record<AttributeTrait["trait"], number>
        }>
    )[action.category].traits[action.trait]++;
}

这比冗余代码的类型安全性较差,但至少它可以让您继续前进。


好的,希望有帮助;祝你好运!

Playground 代码链接 https://www.typescriptlang.org/play/#code/MYewdgzgLgBAhlKAnAlgIwK5QKYRgXhgG8AoGcmABwAsBPCFYOAGwC5iyKvk4UoJ2pLsIrQk2MAHMo1dgEYANJxFcAJtgAeOVFFrylK4dDgBbFGDj7lwgL7WbB0SGAoWg69yS9+7w12DUcKgQJpYwih4qoWAolBjMCCjgVn4UcJSU2EFwYMDYKSp2XA7WJhJQbhyGPHwCValU2Eh5lFBJYAWp5jjMzCiSEnmdfgDutcPF9iQ2ANwkJLqZMACCiKiYOAAqXnwE1gA+9SJMOJIgSHowAOQ09IwsV3PVO1DsANbYtCAAZjCL2D94Gt0FhcAA6W4MJjMME1fhPChFCiHIQqE7YM4XdhXCDOVzMR6Rchw96fQH-QEIZAgnAQMG4lwsWEvCAI8hI8gookwdGYy5XMpgCoEtnCEkwD5fX4U35U9agumC4XM7ys+xzEigSCwODANrJFbAjbYbbeAhHHkIDHnfkM-FXRzEl7Y6KxeKJcBXabzb4YXL6sAwczAcRKgBK2FUftUOSgAApdQH2KtqcbTXwAJQWiBjKABGAJvXtMG8m1Z1HHOAQbAwABEkPuzFrrG5XDlNNwAG1E8XSxcALoq2rdovgIdQfsAaknosM4igGCQYFnFCY1brdpYzdbaSNCpHAZLVr5g7hEAPxbhU5nO-I88Xy+5a5rtaVW5bDSBqf3PbHfdop4sheY5XtOK4iPeS6inYdgkL6-rtEGuShuUhZJoa35bC85bWAme60vAEDchGoBIKoAA8Kbylh3idrW-61v2CgWs8qrsCR5wUVRHbplAdFwoxzFgBgJhoE0AB83I2JJXAZsBYBHqcNqAaq8njtecywUAA

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

TypeScript 依赖的字符串文字属性和索引 的相关文章

随机推荐

  • 在 magento 前端显示缺货状态

    我需要在产品页面 前端 上显示当前商品仅用于延期交货 并且没有库存 目前 我的库存显示了可用数量 而缺货的产品则没有显示任何内容 有谁知道我可以在 view phtml 文件中放入一个代码 该代码只会在那些设置为缺货的产品上显示一条消息 T
  • 我应该使用 Java 中的哪个线程池?

    有大量的任务 每个任务都属于一个组 要求是每组任务应该像在单线程中执行一样串行执行 并且在多核 或多CPU 环境中吞吐量应该最大化 注意 组的数量也与任务数量成正比 最简单的解决方案是使用 ThreadPoolExecutor 并同步 或锁
  • sklearn:关闭警告

    当我适合的时候sklearn s LogisticRegression使用 1 列 pythonpandas DataFrame not a Series对象 我收到此警告 Library Python 2 7 site packages
  • 设置一个二维数组,稍后更改大小 - C

    是否可以在 C 中声明一个二维数组 然后再设置其大小 我知道在 C 中你必须处理内存等问题 但尽管我进行了所有搜索 但我找不到这个问题的答案 我当前的例子是 int boardsize linewin char array 1 1 boar
  • .xib 中的 UITableView 没有内容属性

    XCode 4 2 iOS 5 为了重用表格视图 带有导航栏和编辑 添加按钮 我创建了一个UITableViewController拥有自己的子类 xib 但是 当我添加一个UITableView to my xib的主视图内容属性 我想将
  • 如何为单个 If 语句执行多个条件

    我试图在 vbscript 中的单个 If 语句上执行两个条件 应该很简单 但它不起作用 就像是 If Not fileName testFileName fileName lt gt Then Else 我用两个 if 语句来让它工作 但
  • 使CPU的缓存失效

    当我的程序执行具有获取语义的加载操作 具有释放语义的存储操作或可能是完整栅栏时 它会使 CPU 的缓存无效 我的问题是 缓存的哪一部分实际上失效了 只有保存我使用的获取 释放变量的缓存行 或者整个缓存都失效了 L1 L2 L3 等等 当我使
  • 将 Office365 REST 日历 ID 映射到 EWS 日历项目 ID

    使用交换推送通知 https msdn microsoft com en us library aa566188 v exchg 80 aspx我一直在创建一项同步 Office365 用户的日历数据的服务 我一直在使用以下组合Office
  • 如何在 MYSQL 中获取主管姓名而不是 UserID + INNER JOIN

    这是我的表格 从用户中选择 USERID NAME STATUS 1 AAA Member 2 BBB Member 3 CCC Supervisor 4 DDD Member 5 EEE Member 从出席中选择 NO DATE SUP
  • 在自定义行为上绑定依赖属性时出错

    我正在探索 Silverlight 附加行为机制 以便在我的 Silverlight 应用程序中使用模型 视图 视图模型模式 首先 我试图让一个简单的 Hello World 工作 但我完全陷入了一个错误 无法找到解决方案 我现在拥有的是一
  • 如何计算图像是横向还是纵向

    我正在使用 jquery 创建一个图片库 有没有可能使用jquery计算图像是横向还是纵向 感谢您的支持 您可以简单地比较图像的宽度和高度 var someImg someId if someImg width gt someImg hei
  • 将类的序列化放入DLL中

    我正在寻找一个 工作 示例 用于在 DLL 中外部序列化类结构 目前我找不到任何例子 Boost 文档只是说明一些宏 论坛和新闻组只是讨论具体问题及其解决方案 所以我要求提供一个 外部 序列化类结构的示例 如下所示 除了类代码之外 我还添加
  • OSX 安装 Rsymphony - 链接标头和库

    symphony 已在终端中正确安装和测试 当尝试从源代码安装 Rsymphony 时 R 抱怨缺少标头和库 非常感谢任何指点 谢谢你 symphony安装目录 Users timo Applications symphony R安装命令
  • 使用 php str_getcsv 函数将 csv 文件数据转换为数组

    我有类似使用创建的字符串fputcsv http php net manual en function fputcsv php Date Name Hours 2013 01 02 Test User 7 59 2013 01 03 Tes
  • 将条件的“Future”更改为静态类型“bool”

    这个问题真的非常相似this one https stackoverflow com questions 54691370 flutter returning a bool type from a futurebool method 我已遵
  • 如何在 Zend Framework 2 中创建通用模块/控制器/操作路由?

    我想在 Zend Framework 2 中创建一个通用模块 控制器 操作路由 以便与 ZF2 MVC 架构一起使用 在 ZF1 中 默认路由的定义如下 module controller action 其中模块默认为default 控制器
  • 为什么我的数组中的指针指向同一个字符串?

    我试图理解为什么会出现问题 我有一个文件 我从中读取了几行 char array slave 128 int i 0 while read getline line len fp 1 if strstr line X NULL array
  • PostgreSQL 自动增量在每次更新时增加

    每次我执行 INSERT 或 UPSERT 发生冲突更新时 时 每个表上的增量列都会按之前的更新数量递增 例如 如果我有这张表 id int4 title text description text updated at timestamp
  • iPhone 上的 adhoc 应用程序安装失败,为什么?

    我正在开发一个 iPhone 应用程序 由于应用程序具有位置感知功能 因此我正在不同的地方 我不在场的地方 对其进行测试 为此 我向我的朋友发送了 mobileprovision 配置文件和应用程序临时构建 但最后应用程序安装停止在中间 在
  • TypeScript 依赖的字符串文字属性和索引

    如同Typescript 属性的类型依赖于同一对象中的另一个属性 https stackoverflow com questions 56949513 typescript type of a property dependent on a