web-dev-qa-db-fra.com

TS - Seule une fonction void peut être appelée avec le mot-clé 'new'

Je reçois cette erreur étrange de TypeScript:

"Seule une fonction void peut être appelée avec le mot-clé 'new'."

Quoi?

enter image description here

La fonction constructeur ressemble à ceci:

function Suman(obj: ISumanInputs): void {

  const projectRoot = _suman.projectRoot;

  // via options
  this.fileName = obj.fileName;
  this.slicedFileName = obj.fileName.slice(projectRoot.length);
  this.networkLog = obj.networkLog;
  this.outputPath = obj.outputPath;
  this.timestamp = obj.timestamp;
  this.sumanId = ++sumanId;

  // initialize
  this.allDescribeBlocks = [];
  this.describeOnlyIsTriggered = false;
  this.deps = null;
  this.numHooksSkipped = 0;
  this.numHooksStubbed = 0;
  this.numBlocksSkipped = 0;

}

Je n'ai aucune idée du problème. J'ai essayé d'ajouter et de supprimer le type de retour (void) mais cela n'a rien fait.

12
Alexander Mills

Le problème est que ISumanInputs n'inclut pas une ou plusieurs des propriétés que vous incluez dans votre appel o que vous n'avez pas correctement rempli l'interface IsumanInputs .

Dans le cas de propriété supplémentaire, vous devriez obtenir une erreur "supplémentaire":

Le littéral d'objet peut uniquement spécifier des propriétés connues, et 'anExtraProp' n'existe pas dans le type 'ISumanInputs'

Dans le cas de la propriété manquante, vous obtiendrez une erreur "supplémentaire" différente:

La propriété 'timestamp' est manquante dans le type '{fileName: string; networkLog: chaîne; outputPath: string; } '.

Chose intéressante, si vous déplacez la définition de l'argument hors ligne, la casse propriété supplémentaire n'échoue plus:

const data = {
  fileName: "abc",
  networkLog: "",
  outputPath: "",
  timestamp: "",
  anExtraProperty: true
};

new Suman(data);
4
Sean Vieira

Comme l'a souligné Sean, il s'agit d'une conséquence moins évidente de la non-concordance de type dans les arguments.

Dans le cas où une raison plus profonde vous intéresse: lorsque les arguments d'une fonction ne vérifient pas, tsc déduit que le type de retour est un type spécial never (en remplaçant void que vous avez spécifié). Et new avec une telle fonction entraînera TS2350 Only a void function can....

Cet extrait peut déclencher TS2350 sans arguments incorrects.

function Ctor(): never {
    throw "never return";
}

const v = new Ctor();
5
Jokester