【问题标题】:window.onerror in TS 0.9.5 is impossible. :)TS 0.9.5 中的 window.onerror 是不可能的。 :)
【发布时间】:2013-12-28 07:22:57
【问题描述】:

这个非常游乐场链接曾经在 TS 0.9.5 之前工作,现在我不知道如何让它为我的生活工作。

http://www.typescriptlang.org/Playground/#src=window.onerror=%20function%28eventOrMessage%3a%20any,%20source%3a%20string,%20fileno%3a%20number%29%7B%0A%09//%20place%20your%20body%20here%20%0A%7D;

基本上:

window.onerror= function(eventOrMessage: any, source: string, fileno: number){
    // place your body here 
};

...返回错误:

错误 8 无法转换 '(eventOrMessage: any, source: string, fileno: number) => void' 到 'ErrorEventHandler':类型的调用签名 '(eventOrMessage: any, source: string, fileno: number) => void' 和 'ErrorEventHandler' 不兼容。

【问题讨论】:

    标签: typescript


    【解决方案1】:

    基于 basarat 解决方案(我只是添加了可选的错误参数,可能会有所帮助):

    window.onerror = function(errorMsg: any, url: string, lineNumber: number, colNumber: number, error: { stack?: string } = null) {
        // .. error handler
    };
    

    【讨论】:

      【解决方案2】:

      正如史蒂夫芬顿所说。或者,您可以使用两个函数之间的公共签名:

      window.onerror= function(eventOrMessage: any, source: string, fileno: number, colnumber?:number):any{
          // place your body here 
      };
      

      【讨论】:

      • 谢谢巴萨拉特。我从您的回答和@steve-fenton 中学到了一些东西。我整理了这个游乐场脚本,说明了与这个问题相关的一些有趣的事情。 bit.ly/18BvQ8v 你的回答肯定更简洁,但史蒂夫的回答确实展示了其他扭曲语言的方法,而且他是第一个,所以我将他的答案作为公认的答案。
      【解决方案3】:

      对我(甚至可能是编译器)来说,这看起来像是 lib.d.ts 中的一个错误 - 因为他们在最新分支中更改了 ErrorEventHandler 的定义。

      在 0.9.5 中是:

      interface ErrorEventHandler {
          (event: Event, source: string, fileno: number, columnNumber: number): void;
          (message: any, uri: string, lineNumber: number, columnNumber?: number): boolean;
      }
      

      但在主分支中是:

      interface ErrorEventHandler {
          (event: Event, source: string, fileno: number, columnNumber: number): void;
      }
      

      与此同时,您可以使用以下 hack(或编辑您的 lib.d.ts 文件以更新它)。

      interface TempErrorEventHandler {
          (event: Event, source: string, fileno: number, columnNumber: number): void;
      }
      
      var test1: TempErrorEventHandler =
          function (event: Event, source: string, fileno: number, columnNumber: number): void {
      
          }
      
      window.onerror = <ErrorEventHandler> test1;
      

      【讨论】:

      • 老兄,你很聪明。这么聪明。我对TS的了解还不够,但是像这样有两个无名的方法是无效的吗? window.onerror 如何知道要调用哪个实现?
      • 该接口表示一个具有两个重载的函数 - 因此 TypeScript 将检查参数列表以找出正在调用两者中的哪一个(然后也将知道适当的返回类型)。我并不聪明——TypeScript 的人虽然非常聪明——编译器中的类型推断非常棒。
      • Steve 和 Basarat 再次让我感到沮丧!顺便说一句,这是否已作为 CodePlex 上的问题提出?我可以看到:typescript.codeplex.com/workitem/1570 但这是指 0.9.1.1。我现在正在解决这个问题,但最好在 TS 中正确解决这个问题。
      • 在这里在 CodePlex 上提出它:typescript.codeplex.com/workitem/2062 因为我看不到它已经在其他地方提出......
      猜你喜欢
      • 1970-01-01
      • 2021-06-06
      • 2021-10-27
      • 2021-02-03
      • 1970-01-01
      • 2021-06-03
      • 2019-09-09
      • 2010-12-27
      • 1970-01-01
      相关资源
      最近更新 更多