【问题标题】:TS - Only a void function can be called with the 'new' keywordTS - 只能使用 'new' 关键字调用 void 函数
【发布时间】:2017-09-15 00:17:24
【问题描述】:

我从 TypeScript 收到这个奇怪的错误:

"只有 void 函数可以用 'new' 关键字调用。"

什么?

构造函数,长这样:

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

【问题讨论】:

  • new (function Class() {})() 引发警告。

标签: node.js typescript typescript2.0


【解决方案1】:

问题在于ISumanInputs 不包含您在调用中包含的一个或多个属性您没有正确实现IsumanInputs 接口。 p>

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

对象字面量只能指定已知属性,而“ISumanInputs”类型中不存在“anExtraProp”

在缺少属性的情况下,您会得到一个不同的“额外”错误:

类型'{ fileName: string; 中缺少属性'timestamp';网络日志:字符串;输出路径:字符串; }'。

有趣的是,如果您将参数的定义移出线,则 extra property 案例不再失败:

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

new Suman(data);

【讨论】:

    【解决方案2】:

    正如 Sean 指出的,这是参数类型不匹配的不太明显的后果。

    如果您对更深层次的原因感兴趣:当函数的参数不进行类型检查时,tsc 将返回类型推断为特殊类型 never(覆盖您指定的 void)。而new有这样的功能会导致TS2350 Only a void function can...

    这个 sn-p 可以在没有错误参数的情况下触发 TS2350。

    function Ctor(): never {
        throw "never return";
    }
    
    const v = new Ctor();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-21
      • 2020-02-26
      • 1970-01-01
      • 2015-08-21
      • 2021-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多