TypeScriptから次の奇妙なエラーが発生します。
「 'new'キーワードで呼び出すことができるのはvoid関数のみです。」
何ですか?
コンストラクタ関数は次のようになります。
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)を追加および削除してみましたが、何も起こりませんでした。
問題は、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);
ショーンが指摘したように、これは引数の型の不一致による明白ではない結果です。
より深い理由が気になる場合:関数の引数がタイプチェックしない場合、tsc
は戻り値の型を特殊な型never
と推測します(指定したvoid
を上書きします)。そして、そのような関数を含むnew
はTS2350 Only a void function can...
。
このスニペットは、誤った引数なしでTS2350をトリガーできます。
function Ctor(): never {
throw "never return";
}
const v = new Ctor();