web-dev-qa-db-fra.com

La propriété '0' est manquante dans le type

J'ai mon interface comme ça 

export interface Details {
    Name: [{
        First: string;
        Last: string;
    }];
}   

J'ai une variable de configuration observable 

Configuration: KnockoutObservable<Details> = ko.observable<Details>();

et je voudrais lui attribuer une valeur dans le constructeur comme suit - 

config = {
         Name: [{
               First: "ABC",
               Last: "DEF"
            },
            {
               First: "LMN",
               Last: "XYZ"
            }]
        };

this.Configuration(config);

et je reçois une erreur: 

Les types de propriété 'Nom' sont incompatibles et la propriété '0' est manquante en type.

Tapez '{First: string; Dernier: chaîne; } [] 'n'est pas assignable au type' [{ D'abord: chaîne; Dernier: chaîne; }] '

Je n'ai pas le contrôle sur la modification de l'interface, car elle est utilisée ailleurs. Quelle est la bonne façon d'initialiser cette variable de configuration?

Merci d'avance.

13
rkt

Je suis tombé sur le même problème et je l'ai contourné en modifiant l'interface en:

    interface Details {
        Name: {
            First: string;
            Last: string;
        }[];
    }

Je sais que vous ne voudrez peut-être pas que l'interface change, mais j'espère que cela aidera toutes les personnes se trouvant dans cette situation.

14
RyanA91

Dans cette définition de type:

interface Details {
  Name: [{
    First: string;
    Last: string;
  }];
}

Name n'est pas un tableau au moment de la compilation. C'est un tuple avec un élément. Les tuples dans TypeScript sont autorisés à avoir des éléments supplémentaires, mais ils ne peuvent pas avoir des éléments manquants. En tant que 1-Tuple, Name est essentiellement un tableau qui doit avoir au moins un élément.

Cependant, dans cette valeur:

const config = {
  Name: [{
    First: "ABC",
    Last: "DEF"
  },
  {
    First: "LMN",
    Last: "XYZ"
  }]
};

En l'absence de typage explicite, la propriété Name est définie par défaut sur le type tableau. Les tableaux peuvent avoir n'importe quel nombre d'éléments, y compris zéro - ce qui ne rentre pas dans un 1-Tuple. D'où votre erreur.

Votre erreur peut être corrigée en donnant au compilateur un indice que votre littéral est en fait un tuple:

const config: Details = { Name: [{...}, {...}] };

Si vous devez être capable de prendre un tableau de noms, vous devrez faire un casting, peut-être quelque chose comme ça:

if (names.length > 0) {
  const config = {
    Name: names as Details['Name']
  };
  Configuration(config);
}

(Vous pouvez supprimer la case if si vous pouvez déterminer que le tuple est simplement une erreur de la part de celui qui a écrit les dactylographies.)

Référence Tuples: https://www.typescriptlang.org/docs/handbook/basic-types.html

8
dbandstra

La mise à jour de l'interface suivante devrait résoudre le problème: 

 interface Details {
        Name: Array<{
            First: string;
            Last: string;
        }>;
    }
6
Rajaram Nayak

Bien que cela ne soit pas directement lié à cette question précise, si vous rencontrez ce problème lors de l'utilisation d'un objet Carte ES6, les éléments suivants pourraient être utiles: https://github.com/Microsoft/TypeScript/issues/8936 .

1
alukach