2017-04-19 579 views
5

我从打字稿得到这个奇怪的错误被称为:TS - 只有一个void函数可以用“新”关键字

"Only a void function can be called with the 'new' keyword."

什么?

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),但是什么也没做。

+0

'new(function Class(){})()'引发警告。 – Cody

回答

3

的问题是,ISumanInputs不包括你,包括你的电话你没有正确履行IsumanInputs接口的属性的一个或多个。

在额外的属性情况下,你应该得到一个“额外”的错误:

Object literal may only specify known properties, and 'anExtraProp' does not exist in type 'ISumanInputs'

在丢失的财产的情况下,你会得到一个不同的“额外”的错误:

Property 'timestamp' is missing in type '{ fileName: string; networkLog: string; outputPath: string; }'.

有趣的是,如果将参数的定义移出多余的属性则不再失败:

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

new Suman(data); 
+0

谢谢!让我试试看 –

3

正如肖恩指出的那样,这是一个不太明显的论点类型不匹配的结果。

如果您有更深的理由感兴趣:当函数的参数未检查时,tsc推断返回类型为特殊类型never(覆盖您指定的void)。具有这种功能的new将导致TS2350 Only a void function can...

这段代码可以触发TS2350而不会有错误的参数。

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

const v = new Ctor(); 
相关问题