576 votes

Un type de paramètre de signature d'index ne peut pas être un type d'union. Envisagez d'utiliser un type d'objet mappé à la place

J'essaie d'utiliser le modèle suivant :

enum Option {
  ONE = 'one',
  TWO = 'two',
  THREE = 'three'
}

interface OptionRequirement {
  someBool: boolean;
  someString: string;
}

interface OptionRequirements {
  [key: Option]: OptionRequirement;
}

Cela me semble très simple, mais j'obtiens l'erreur suivante :

Un type de paramètre de signature d'index ne peut pas être un type d'union. Pensez à utiliser un type d'objet mappé à la place.

Qu'est-ce que je fais de mal ?

5 votes

Type de key ne peut être qu'une chaîne, un nombre ou un symbole. Enum ne l'est pas.

21voto

Stefan Points 350

Au lieu d'utiliser une interface, utilisez un type d'objet mappé.

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
}

0 votes

Vous n'avez pas besoin d'ajouter autant de types, la solution de @Nacho Justicia Ramos fonctionne. La SEULE chose que certaines personnes négligent est que le dernier type est un TYPE et non une INTERFACE. Vous pourriez donc créer une interface à partir de ce type.

4voto

Questioning Points 417

J'ai eu un problème similaire. J'essayais d'utiliser uniquement des clés spécifiques lors de la création de validateurs de formulaires angulaires.

export enum FormErrorEnum {
  unknown = 'unknown',
  customError = 'customError',
}

export type FormError = keyof typeof FormErrorEnum;

Et l'usage :

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

Cela permettra d'utiliser un nombre de touches compris entre 1 et X.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X