【发布时间】:2021-10-25 12:53:09
【问题描述】:
关于如何断言特定键属于特定接口或类型有许多类似的问题,例如question。我的问题不同,因为有问题的密钥由两部分组成,而不是简单地使用来自 Object.keys 之类的密钥。
这似乎与mapped types 有关,但我什至不知道这是否是 TypeScript 可以解决的问题。目前,我拥有的许多接口都充满了属性名称,这些属性名称是名称前缀的可预测组合,例如team,以及数字部分。这些数字总是在某个范围内,例如 1-16 或 1-18。我已经添加了这些没有映射类型的接口,所以它们是非常大的接口,我希望以后可以使用映射类型。
我正在逐渐将文件从 JavaScript 转换为 TypeScript。大多数新转换的 TypeScript 代码仍然不正确地键入为 any 类型。它涉及之前范围的迭代,如下所示:
const name = record[`team${num}`]; // num is from 1-16
我知道record['team${num}'] 不是any 但实际上是string 类型。如果我只是使用点符号 a la record.team1; 写出几十个属性名称,那么就没有错误并且类型检查工作正常。简单的断言as string、as unknown as string 和as (typeof record[keyof typeof record]) 都不会从有问题的代码中删除错误消息。我现在知道如何使用类型断言来suppress 类型错误,但请注意代码会导致一个错误,而现在实际上是运行时错误时没有错误。
有没有一种惯用的方式来检查使用 TypeScript 的类型?我不想要一个错误,等等。我的一些代码可以重写以使用现有属性,而其他代码则从那些使用名称和数字组合索引的现有属性创建新属性。
【问题讨论】:
-
您能否提供一个minimal reproducible example 的代码,以在将您的问题按原样放入 TypeScript Playground 等独立 IDE 时演示您的问题?
-
据我所知,解决方法可能很简单,只需将
as const放入其中,如this,但真的很高兴看到record和num的一些定义。 -
我添加了代码。这是否有助于澄清我是如何尝试输入检查的?