<noscript id="e34cf239"></noscript>
       
       
       



        1. 狗万官网酒店 > 狗万官网下载 > 简言之了解TypeScript外方如何继续 Error 类_javascript艺术

          简言之了解TypeScript外方如何继续 Error 类_javascript艺术

          来源: 2019-08-04 19:43 我来投稿 参与评论
          这篇文章主要介绍了简易了解TypeScript外方如何继续 Error 类,一度典型的工作站服务器可能需要有 NetworkError, DatabaseError, UnauthorizedError 等。 咱愿意这些类都获得 Error 的特色:有不当消息、有合同栈、有丰厚打印的 toString 等。,要求的爱人可以参考下

          前言

          在JavaScript 外方有的是时候都要求自定义错误,尤其是开发 Node.js 运用的时光。 比如一个典型的工作站服务器可能需要有 NetworkError, DatabaseError, UnauthorizedError 等。 咱愿意这些类都获得 Error 的特色:有不当消息、有合同栈、有丰厚打印的 toString 等。 最直观的落实方式便是 继续 Error 类。 但考虑 TypeScript 要求编译到 ES5 结构性问题会较为复杂, 本文用来辅助理解 TypeScript 联网承 Error 的题目来源以及对应的几种解决办法。

          咱需要怎样的 CustomError

          为了容易讨论最佳实践,最先明确我们自定义的 CustomError 要求做到哪些功能。 下是 Harttle 的视角:

          1. 可以选用 new CustomError() 来创造,并且 instanceof Error 借鉴应该返回 true。可以用来创造是主导要求,能够把视为 Error 的病例能够兼容既有系统(比如 toString() 要返回调用栈),同时符合惯例。
          2. .stack 属性首趟应为 CustomeError: <message>。如果是 Error: <message> 可能就没那么漂亮。
          3. .stack 属性应当包含调用栈并指向 new CustomError() 的那一行。这一点可能是重要,如果指向 CustomError 组织函数中的某一行,就会给这个类的采取方造成困惑。

          下举个比喻,这是一番 message 为 "intended" 的 CustomError 的 .stack 属性值:

          CustomError: intended
          at Object.<anonymous> (/Users/harttle/Downloads/bar/a.js:10:13)
          at Module._compile (module.js:653:30)
          at Object.Module._extensions..js (module.js:664:10)
          at Module.load (module.js:566:32)
          at tryModuleLoad (module.js:506:12)
          at Function.Module._load (module.js:498:3)
          at Function.Module.runMain (module.js:694:10)
          at startup (bootstrap_node.js:204:16)
          at bootstrap_node.js:625:3

          ES5 外方如何继续 Error?

          Error 是一番奇异的目标,或者说 JavaScript 的 new 是一番鲜花的生存。 为方便后续讨论,咱先讨论组 ES5 一时是怎样继承 Error 的。 咱说 JavaScript 是一门混杂的语言,如何继续 Error 就是一番典型的事例。 如果你熟悉 原型继承的主意,应当会写出如下代码:

          function CustomError (message) {
          Error.call(this, message)
          }
          CustomError.prototype = new Error()

          因为 stack 只在 new 的时光生成,上述实现不能满足功能 2 和功力 3,具体说来:

        2. stack 的顺序一行是总是 Error 而不是 CustomError 且不包含 message 消息。
        3. stack 总是指向 new Error() 的那一行,而不是 new CustomError()。
        4. Node 文档 外方描述了一下 captureStackTrace 艺术来解决这个题目,改变后的落实如下:

          function CustomError (msg) {
          this.name = 'CustomError'
          this.message = msg
          Error.captureStackTrace(this, CustomError)
          }
          CustomError.prototype = new Error()

          其中 .captureStackTrace() 会利用传入对象的 name 和 message 来生成 stack 的前缀;同时第二个参数用来指定在调用栈中忽视掉哪一部分,这样栈就会指向 new CustomError 的中央而不是 captureStackTrace() 的中央。

          ES6 外方如何继续 Error?

          既然 ES6 穿越 class 和 extends 等关键字给出了类继承机制, 这就是说想必通过编制 CustomError 类来继续 Error。真相也确实如此,只要求在组织函数中滥用父类构造函数并赋值 name 即可实现文章开始提到的三个力量:

          class CustomError extends Error {
          constructor(msg) {
          super(msg)
          this.name = 'CustomError'
          }
          }

          TypeScript 外方如何继续 Error?

          ES6 外方提供了 new.target 属性, 有效 Error 的组织函数中得以获取 CustomError 的消息,以形成原型链的调节。 故而 TypeScript 要求编译到 ES5 时上述功能仍然是心有余而力不足自动实现。 在 TypeScript 中的体现是形如上述 ES6 的编码片段会把编译成:

          var CustomError = /** @class */ (function (_super) {
          __extends(CustomError, _super);
          function CustomError(msg) {
          var _this = _super.call(this, msg) || this;
          _this.name = 'CustomError';
          return _this;
          }
          return CustomError;
          }(Error));

          瞩目 var _this = _super.call(this, msg) || this; 外方 this 把替换掉了。 在 TypeScript 2.1 的 changelog 外方描述了这个 Breaking Change。 **这会造成 CustomError 的任何对象方法都无法运用,此地介绍几种 workaround:

          题外话,本条分支可能会导致测试覆盖率中的 分支未覆盖问题。可以只在 ES6 副产生测试覆盖报告来解决。

          1. 利用 setPrototypeOf 还原原型链

          这是 TypeScript 法定给出的消灭办法,见这里。

          class CustomError extends Error {
          constructor(message) {
          super(message);
          Object.setPrototypeOf(this, FooError.prototype);
          }
          }

          瞩目这是一番性能很差的主意,且在 ES6 外方提出,结构性也很差。在不兼容的条件下可以利用 __proto__ 来替代。

          2. 坚持不懈利用 ES5 的主意

          不利用 ES6 特色,仍然使用本文前面介绍的 『ES5 外方如何继续 Error?』送出的主意。

          3. 限制对象方法的采取

          虽然 CustomError 的目标函数无法运用,但 CustomError 仍然支持 protected 级别的主意供子类使用,阉割的中央在于自己不能滥用。 鉴于 JavaScript 外方对象属性必须在组织函数内赋值,故而对象属性也不会受到影响。具体说来:

          class CustomError extends Error {
          count: number = 0
          constructor(msg) {
          super(msg)
          this.count // OK,属性不受影响
          this.print() // TypeError: _this.print is not a function,因为 this 把替换了
          }
          print() { 
          console.log(this.stack)
          }
          }
          class DerivedError extends CustomError {
          constructor(msg) {
          super(msg)
          super.print() // OK,因为 print 是直接从父类原型获取的,即 `_super.prototype.print`
          }
          }

          上述就是本文的方方面面内容,瞩望对大家的上学有所帮助,也愿意大家多多支持脚本的师。

          义务编辑:狗万官网酒店
           
           
          0% (0)
           
           
          0% (0)
          机长评论( ) 请自觉遵守互联网相关的富民政策法规,不准发布色情、暴力、反动的议论。
          地名: 匿名?