881 votes

La propriété '...' n'a pas d'initialiseur et n'est pas définitivement affectée dans le constructeur.

Dans mon application Angular j'ai un composant:

import { MakeService } from './../../services/make.service';
import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-vehicle-form',
  templateUrl: './vehicle-form.component.html',
  styleUrls: ['./vehicle-form.component.css']
})
export class VehicleFormComponent implements OnInit {
  makes: any[];
  vehicle = {};

  constructor(private makeService: MakeService) { }

  ngOnInit() {
    this.makeService.getMakes().subscribe(makes => { this.makes = makes
      console.log("MAKES", this.makes);
    });
  }

  onMakeChange(){
    console.log("VEHICLE", this.vehicle);
  }
}

mais dans la propriété "makes" j'ai une erreur. Je ne sais pas quoi en faire...

erreur

0 votes

Je me demande : Sur les nouvelles versions de TypeScript, est-ce que quelqu'un a réussi à spécifier le type d'objet qui résidera à l'intérieur du tableau? Au lieu d'utiliser Any[]...

1478voto

Martin Čuka Points 747

Il suffit d'aller dans tsconfig.json et de régler

"compilerOptions": {
    "strictPropertyInitialization": false,
    ...
}

pour vous débarrasser de l'erreur de compilation.

Sinon, vous devez initialiser toutes vos variables, ce qui est un peu ennuyeux.

39 votes

Assurez-vous simplement d'ajouter cela après "strict": true sinon le transpileur semble le réactiver à nouveau (bien que VS semble savoir qu'il est désactivé).

295 votes

De cette manière, vous allez désactiver la vérification stricte de l'initialisation des propriétés pour l'ensemble du projet. Il est préférable d'ajouter l'opérateur postfixe ! au nom de la variable, pour simplement ignorer ce cas, ou d'initialiser la variable à l'intérieur du constructeur.

40 votes

Vous suggérez d'ignorer les problèmes potentiels signalés par le compilateur, ce n'est pas vraiment sûr. Donc désapprouver.

369voto

Sajeetharan Points 108195

Je pense que vous utilisez la dernière version de TypeScript. Veuillez consulter la section "Initialisation stricte de classe" dans le lien.

Il y a deux façons de résoudre ce problème :

A. Si vous utilisez VSCode, vous devez modifier la version de TS que l'éditeur utilise.

B. Il suffit d'initialiser le tableau lors de sa déclaration

makes: any[] = [];

ou à l'intérieur du constructeur :

constructor(private makeService: MakeService) { 
   // Initialisation à l'intérieur du constructeur
   this.makes = [];
}

1 votes

Désolé, je suis nouveau en typescript. Pouvez-vous me dire où est mon erreur?

3 votes

Comme l'erreur le dit, vous devez initialiser la variable à une valeur quelconque : any[] = [];

233 votes

Vous devez utiliser l'assertion d'assignation définie pour indiquer à typescript que cette variable aura une valeur à l'exécution comme suit : makes!: any[];

331voto

Harinath Points 173

C'est parce que TypeScript 2.7 inclut une vérification stricte de classe où toutes les propriétés doivent être initialisées dans le constructeur. Une solution de contournement consiste à ajouter le ! comme suffixe du nom de la variable:

makes!: any[];

45 votes

La syntaxe "!" existe pour les cas assez courants où l'on ne peut garantir que la valeur sera définie immédiatement. C'est une échappatoire et il ne faut pas trop s'y fier, car cela peut rendre votre code moins sûr. Une valeur par défaut est généralement préférée. Bon à savoir que cela existe, cependant.

1 votes

@kingdaro a raison. Bien que cela puisse généralement être utilisé, cela peut également entraîner un code qui ne fonctionne pas du tout. Par exemple, dans l'application Web de base générée par VS2017, modifiez l'assignation des prévisions dans fetchdata.components.ts en ajoutant le '!' (prévisions publiques !: WeatherForecast[];) et cela provoquera une erreur complète.

4 votes

C'est la meilleure solution, car elle se trouve directement après le décorateur @Input() (dans le nouveau Angular). Lors de la lecture de n'importe quel composant donné, cela se lit naturellement et élimine les erreurs de développement.

23voto

kshetline Points 5228

Vous devez soit désactiver le --strictPropertyInitialization auquel Sajeetharan a fait référence, soit faire quelque chose comme ceci pour satisfaire l'exigence d'initialisation :

makes: any[] = [];

17voto

SpeedOfSpin Points 732

Vous pouvez également faire ce qui suit si vous ne voulez vraiment pas l'initialiser.

makes?: any[];

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