打字稿:'new' 表达式,其目标缺少构造签名,隐式具有 'any' type.ts(7009)

Ben*_*ler 6 javascript ecmascript-5 typescript

以下是最适合在 Chrome Devtools、Node.js 等中显示自定义错误的代码。基于此 StackOverflow 答案

function CustomErr (message) {
  var err = new Error(message)
  Object.setPrototypeOf(err, CustomErr.prototype)
  return err
}

CustomErr.prototype = Object.create(Error.prototype, {
  name: { value: 'Custom Error', enumerable: false }
})
Run Code Online (Sandbox Code Playgroud)

但是,当我将其转换为 Typescript 时:

function CustomErr (message: string) {
  var err = new Error(message)
  Object.setPrototypeOf(err, CustomErr.prototype)
  return err
}

CustomErr.prototype = Object.create(Error.prototype, {
  name: { value: 'Custom Error', enumerable: false }
})
Run Code Online (Sandbox Code Playgroud)

调用throw new CustomErr("something went wrong")显示此错误:

'new' expression, whose target lacks a construct signature, implicitly has an 'any' type.ts(7009)
Run Code Online (Sandbox Code Playgroud)

我该怎么做才能正确地对我的代码进行类型注释?如果您能找到另一个等效的代码解决方案,请随时提出建议,但它必须在 Chrome DevTools 中具有相同的行为(我尝试过的所有解决方案中仅此一项即可很好地显示自定义错误名称)。谢谢!

编辑:需要支持旧浏览器,所以我不能使用 ES6 类。我不想将类转换为 ES6,因为我正在创建一个轻量级的库,而一个类的 polyfill 就占了我整个代码大小的 10%。

总结一下,我如何注释我现在拥有的代码?

Ale*_* L. 7

您可以声明类,但使用函数来实现它。这样输出(生成的 javascript)不会受到影响,但CustomErrtypescript会将其视为“newable”:

declare class CustomErr extends Error {
    constructor(message: string);
}

function CustomErr(message: string) {
    var err = new Error(message)
    Object.setPrototypeOf(err, CustomErr.prototype)
    return err
}

CustomErr.prototype = Object.create(Error.prototype, {
    name: { value: 'Custom Error', enumerable: false }
})

throw new CustomErr("something went wrong") // no error now
Run Code Online (Sandbox Code Playgroud)

操场

  • 您将如何导出类型和函数?TypeScript 告诉我不允许导出它 (2认同)