En TypeScript, ¿hay alguna manera de acceder a la propiedad de una propiedad de interfaz de tipo array?
Estoy escribiendo un generador de código para generar TypeScript a partir de una definición JSON de una estructura de datos. Estoy teniendo un problema al acceder a propiedades en arrays de objetos dentro de una interfaz.
Aquí hay una interfaz de ejemplo que plantea el problema:
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; }[]'
}
Al intentar acceder a SomeComplexThing['propC']['propCA']['propCA1'] obtengo el error:
Property 'propCA1' does not exist on type '{ propCA1: string; propCA2: number; }[]'
Ahora sé que puedo acceder a la propiedad usando un índice de array así:
SomeComplexThing['propC']['propCA'][0]['propCA1']O incluso así:
SomeComplexThing['propC']['propCA'][1234]['propCA1']Parece extraño no poder acceder a la propiedad dentro de este tipo de arreglo sin tener que referenciarla por algún número arbitrario... Al generar el código, actualmente no tengo el contexto para saber que SomeComplexThing['propC']['propCA'] es un tipo de arreglo, así que no puedo agregar [0] allí ya que el tipo podría ser simplemente un objeto.
¿Hay otra manera de escribir esto en Typescript, o alguna función utilitaria que podría usar para acceder de manera segura a la propiedad sin usar la referencia del índice del array?
Respuesta #1
Como descubriste, indexar un tipo de arreglo con un número te dará el tipo de elemento. El enfoque más general es indexar usando el propio tipo number
propD: SomeComplexThing['propC']['propCA'][number]['propCA1']
Enlace del parque
Nota: Indexar con un número específico frente al tipo de número producirá el mismo resultado para los arrays, pero podría producir resultados diferentes para las tuplas, que sí tienen un tipo diferente para cada valor de índice. Aquí, indexar por number obtendrá una unión de todos los tipos de elementos en la tupla
