Typescript:'new'表达式,其目标缺少构造签名,隐式具有'any'类型。ts(7009)

问题描述 投票:2回答:3

以下是最适合显示Chrome Devtools,Node.js等中的自定义错误的代码。基于this StackOverflow answer。>>

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 }
})

但是,当我将其转换为打字稿时:

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")显示此错误:

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

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

编辑

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

因此,我该如何注释现在的代码?

以下是最适合显示Chrome Devtools,Node.js等中的自定义错误的代码。基于此StackOverflow答案。函数CustomErr(消息){var err = new Error(...

javascript typescript ecmascript-5
3个回答
0
投票

几件事。这样做的目的是什么,为什么不让打字稿将代码编译为es5或Babel。我实际上只是在这里复制并粘贴代码,然后编译:https://codepen.io/jaraolveda/pen/ExaWbxy这告诉我您在tsconfig.json上的作用可能太重了。但是,如果您真的想要我,请参阅如何执行类似的操作。这是一个如何做的例子How to implement a Typescript interface to an es5-style "class"?


0
投票

我仍然不知道如何注释我的代码,但是仅将throw new CustomErr('err')更改为throw CustomErr('err')可以解决我的问题。尽管JS允许您使用new构造函数,但TypeScript却不允许。


0
投票

您可以声明类,但可以通过函数来​​实现。这样,输出(生成的javascript)将不会受到影响,但是打字稿会将CustomErr视为“可更新的”:

© www.soinside.com 2019 - 2024. All rights reserved.