Je reçois cette erreur étrange de TypeScript:
"Seule une fonction void peut être appelée avec le mot-clé 'new'."
Quoi?
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.
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);
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();