新的Typescript 1.8.4构建错误:"Build: 属性'result'在类型'EventTarget'上不存在。"

84

我对TypeScript还不熟悉。在我的Durandal应用程序中,我从VS-2012迁移到了VS-2015,也就是从TypeScript 0.9升级到了TypeScript 1.8.4。迁移后,我遇到了许多构建错误。除了一个错误外,我已经解决了所有问题。我在Events类型上得到以下构建错误:

错误:"Build:属性“result”在类型“EventTarget”上不存在"

而代码完全如下所示:

var reader:any,
target:EventTarget;

reader= new FileReader();
reader.onload = function (imgsrc){
    var fileUrl = imgsrc.target.result;
}

"Imgsrc"正在进行类型事件绑定。

它在typescript 0.9中运行良好,但在1.8.4中会抛出错误,错误为“'result'不存在于类型“EventTarget”上。”是否有人可以帮忙解决这个问题。

注意:“target:EventTarget”是从lib.d.ts获取的。

15个回答

2
上述解决方案不能解决我的IndexedDB类似问题,所以我想分享一下在我的情况下起作用的解决方法。通过将(event)函数的参数更改为(event: any),我能够忽略类型错误。
示例代码:
let request = window.indexedDB.open('userChannels', 3);

request.onerror = function(event: any ) {
    console.log('ERROR: Failed to create userChannels local DB' + event.target.errorCode)
  };

request.onsuccess = function(event: any) {
   let db = event.target.result;
   console.log('SUCCESS: Created userChannels local DB')
};

1

代替

    this.localDbRequest.onsuccess = function (event) {
      const db = event.target.result;
    };

做。
   this.localDbRequest.onsuccess = function (event) {
     const db = this.result;
   };

1

以下是访问目标对象的方式,以防止错误,直到修复为止:

reader= new FileReader();
reader.onload = function (imgsrc){
    var fileUrl = imgsrc.target["result"];
}

将目标视为Javascript对象。

0

这是 JavaScript/TypeScript 的一个重大变更。

你只需要将 "event.target.result" 替换为 "this.result" 即可。

这里的 "this" 指的是接口 MSBaseReader 的上下文。

以下是我的实现摘录:

      let reader = new FileReader();
      let profile: TransProfile = new TransProfile();

      reader.onload = function(event){
        profile.avatar = new Uint8Array(this.result);
      }

      reader.onerror = function(event){
      }

      this.photoLib.getPhoto(item)
        .then(blob => reader.readAsArrayBuffer(blob))
        .then(() => this.doUpload(profile));

"

"MSBaseReader" 接口定义:

"
interface MSBaseReader {
    onabort: (this: MSBaseReader, ev: Event) => any;
    onerror: (this: MSBaseReader, ev: ErrorEvent) => any;
    onload: (this: MSBaseReader, ev: Event) => any;
    onloadend: (this: MSBaseReader, ev: ProgressEvent) => any;
    onloadstart: (this: MSBaseReader, ev: Event) => any;
    onprogress: (this: MSBaseReader, ev: ProgressEvent) => any;
    readonly readyState: number;
    readonly result: any;
    abort(): void;
    readonly DONE: number;
    readonly EMPTY: number;
    readonly LOADING: number;
    addEventListener<K extends keyof MSBaseReaderEventMap>(type: K, listener: (this: MSBaseReader, ev: MSBaseReaderEventMap[K]) => any, useCapture?: boolean): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}

"FileReader" 接口定义

interface FileReader extends EventTarget, MSBaseReader {
    readonly error: DOMError;
    readAsArrayBuffer(blob: Blob): void;
    readAsBinaryString(blob: Blob): void;
    readAsDataURL(blob: Blob): void;
    readAsText(blob: Blob, encoding?: string): void;
    addEventListener<K extends keyof MSBaseReaderEventMap>(type: K, listener: (this: FileReader, ev: MSBaseReaderEventMap[K]) => any, useCapture?: boolean): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}

还要注意,由于“onload()”内部的“this”的上下文更改,您基于类的定义在“reader.onload = function(event){...”中不可访问;这意味着您不能使用“this.class-property”样式来访问您的类属性。
您将不得不定义本地变量。请参见上面摘录中“profile”的定义和用法。

0

试试这个。

event.target["result"]

虽然这段代码可能解决了OP的问题,但最好还是解释一下你的代码如何解决OP的问题。这样,未来的访问者可以从您的帖子中学习,并将其应用到自己的代码中。SO不是编码服务,而是知识资源。此外,高质量、完整的答案更有可能被点赞。这些特点以及所有帖子都必须是自包含的要求,是SO作为一个平台的一些优势,使其与论坛区分开来。您可以编辑以添加其他信息和/或使用源文档补充您的解释。 - ysf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接