Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

515
Vistas
Un tipo de parámetro de firma de índice no puede ser un tipo de unión. Considere usar un tipo de objeto mapeado en su lugar

Estoy tratando de usar el siguiente patrón:

 enum Option { ONE = 'one', TWO = 'two', THREE = 'three' } interface OptionRequirement { someBool: boolean; someString: string; } interface OptionRequirements { [key: Option]: OptionRequirement; }

Esto me parece muy sencillo, sin embargo, aparece el siguiente error:

Un tipo de parámetro de firma de índice no puede ser un tipo de unión. Considere usar un tipo de objeto asignado en su lugar.

¿Qué estoy haciendo mal?

over 4 years ago · Santiago Trujillo
7 Respuestas
Responde la pregunta

0

La solución más simple es usar Record

 type OptionRequirements = Record<Options, OptionRequirement>

También puede implementarlo usted mismo como:

 type OptionRequirements = { [key in Options]: OptionRequirement; }

Esta construcción sólo está disponible para type , pero no como interface .

El problema en su definición es decir que la clave de su interfaz debe ser del tipo Options , donde Options es una enumeración, no una cadena, un número o un símbolo.

La key in Options significa "para esas claves específicas que están en el tipo de unión Opciones".

type alias es más flexible y potente que interface .

Si su tipo no necesita ser usado en clase, elija type sobre interface .

over 4 years ago · Santiago Trujillo Denunciar

0

Puede usar el operador TS "en" y hacer esto:

 enum Options { ONE = 'one', TWO = 'two', THREE = 'three', } interface OptionRequirement { someBool: boolean; someString: string; } type OptionRequirements = { [key in Options]: OptionRequirement; // Note that "key in". }
over 4 years ago · Santiago Trujillo Denunciar

0

Tuve un problema similar, pero mi caso fue con otra propiedad de campo en la interfaz, por lo que mi solución es un ejemplo con una propiedad de campo opcional con una enumeración para las claves:

 export enum ACTION_INSTANCE_KEY { cat = 'cat', dog = 'dog', cow = 'cow', book = 'book' } type ActionInstances = { [key in ACTION_INSTANCE_KEY]?: number; // cat id/dog id/cow id/ etc // <== optional }; export interface EventAnalyticsAction extends ActionInstances { // <== need to be extended marker: EVENT_ANALYTIC_ACTION_TYPE; // <== if you wanna add another field to interface }
over 4 years ago · Santiago Trujillo Denunciar

0

En lugar de usar una interfaz, use un tipo de objeto mapeado

 enum Option { ONE = 'one', TWO = 'two', THREE = 'three' } type OptionKeys = keyof typeof Option; interface OptionRequirement { someBool: boolean; someString: string; } type OptionRequirements = { // note type, not interface [key in OptionKeys]: OptionRequirement; // key in }
over 4 years ago · Santiago Trujillo Denunciar

0

Tuve un problema similar. Estaba tratando de usar solo claves específicas al crear validadores de forma angular.

 export enum FormErrorEnum { unknown = 'unknown', customError = 'customError', } export type FormError = keyof typeof FormErrorEnum;

Y el uso:

 static customFunction(param: number, param2: string): ValidatorFn { return (control: AbstractControl): { [key: FormErrorEnum]?: any } => { return { customError: {param, param2} }; }; }

Esto permitirá utilizar 1 - X número de claves.

over 4 years ago · Santiago Trujillo Denunciar

0

En mi caso, necesitaba que las propiedades fueran opcionales, así que creé este tipo genérico.

 type PartialRecord<K extends string | number | symbol, T> = { [P in K]?: T; };

Entonces úsalo como tal:

 type MyTypes = 'TYPE_A' | 'TYPE_B' | 'TYPE_C'; interface IContent { name: string; age: number; } interface IExample { type: string; partials: PartialRecord<MyTypes, IContent>; }

Ejemplo

 const example : IExample = { type: 'some-type', partials: { TYPE_A : { name: 'name', age: 30 }, TYPE_C : { name: 'another name', age: 50 } } }
over 4 years ago · Santiago Trujillo Denunciar

0

En mi caso:

 export type PossibleKeysType = | 'userAgreement' | 'privacy' | 'people'; interface ProviderProps { children: React.ReactNode; items: { // ↙ this colon was issue [key: PossibleKeysType]: Array<SectionItemsType>; }; }

Lo arreglé usando el operador in lugar de usar :

 ~~~ interface ProviderProps { children: React.ReactNode; items: { // ↙ use "in" operator [key in PossibleKeysType]: Array<SectionItemsType>; }; }
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda