在打字稿中有没有办法访问类型数组的接口属性的属性?

In typescript is there a way to access the property of an interface property of type array?

我正在编写代码生成器,以根据数据结构的 JSON 定义生成打字稿。 我在访问接口内对象数组中的属性时遇到问题。

这是一个提出问题的示例界面:

interface SomeComplexThing {
  propA: string
  propB: number
  propC: {
    propCA: Array<{
      propCA1: string
      propCA2: number
    }>
  }
  propD: SomeComplexThing['propC']['propCA']['propCA1'] // Error: Property 'propCA1' does not exist on type '{ propCA1: string; propCA2: number; }[]'
}

尝试访问 SomeComplexThing['propC']['propCA']['propCA1'] 时出现错误:

Property 'propCA1' does not exist on type '{ propCA1: string; propCA2: number; }[]'

现在我知道我可以使用这样的数组索引访问 属性:

SomeComplexThing['propC']['propCA'][0]['propCA1']

甚至像这样:

SomeComplexThing['propC']['propCA'][1234]['propCA1']

无法访问此数组类型中的 属性 而不必通过某个任意数字引用它似乎很奇怪......生成代码时,我目前没有上下文知道 SomeComplexThing['propC']['propCA'] 是一个数组类型,所以我不能在其中添加 [0] 因为该类型可能只是一个对象。

是否有另一种方法可以在 Typescript 中编写它,或者我可以使用某种实用函数来安全访问 属性 而无需使用数组索引引用?

正如您发现的那样,使用数字索引数组类型将使您获得项目类型。更通用的方法是使用 number 类型本身

进行索引
propD: SomeComplexThing['propC']['propCA'][number]['propCA1'] 

Playground Link

注意:使用特定数字与数字类型进行索引会对数组产生相同的结果,但可能会对元组产生不同的结果,元组的每个索引值都有不同的类型。这里按 number 索引将得到元组

中所有项目类型的联合