web-dev-qa-db-ja.com

TS-'new'キーワードで呼び出すことができるのはvoid関数のみです

TypeScriptから次の奇妙なエラーが発生します。

「 'new'キーワードで呼び出すことができるのはvoid関数のみです。」

何ですか?

enter image description here

コンストラクタ関数は次のようになります。

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;

}

何が問題なのかわかりません。戻り値の型(void)を追加および削除してみましたが、何も起こりませんでした。

12
Alexander Mills

問題は、ISumanInputsに、呼び出しに含めている1つ以上のプロパティが含まれていないことですorIsumanInputsインターフェースを適切に実行していない。

追加のプロパティの場合、「追加の」エラーが1つ表示されます。

オブジェクトリテラルは既知のプロパティのみを指定でき、 'anExtraProp'はタイプ 'ISumanInputs'に存在しません

プロパティが見つからない場合は、別の「余分な」エラーが発生します。

タイプ '{fileName:string;にプロパティ' timestamp 'がありません。 networkLog:文字列; outputPath:string; } '。

興味深いことに、引数の定義を行外に移動しても、extra propertyケースは失敗しなくなりました。

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

new Suman(data);
4
Sean Vieira

ショーンが指摘したように、これは引数の型の不一致による明白ではない結果です。

より深い理由が気になる場合:関数の引数がタイプチェックしない場合、tscは戻り値の型を特殊な型neverと推測します(指定したvoidを上書きします)。そして、そのような関数を含むnewTS2350 Only a void function can...

このスニペットは、誤った引数なしでTS2350をトリガーできます。

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

const v = new Ctor();
5
Jokester