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


75

我是打字稿新手。在我的Durandal应用程序中,我将VS-2012迁移到VS-2015,这意味着将打字稿0.9转换为打字稿1.8.4。迁移后,我遇到了很多构建错误。我解决了所有一个问题。我得到以下事件类型的构建错误。

错误:“内部版本: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上可以正常运行,因为'EventTarget'类型上不存在'result'。对此有任何帮助可以解决。

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

Answers:


73

虽然any是一种药物(几乎可以用于任何用途,但是... TypeScript的好处在哪里) ...报告了类似的问题,并建议使用不错的(TypesScript-ish)解决方法

请求在lib.d.ts的事件接口中更改currentTarget

让我引用:

我遇到了这个TS2339:在JS FileReader onload的类型'EventTarget'上不存在属性'result',并且在传递给FileReader的onerror的事件上针对getSummary()发出了另一条警告。

我的解决方法是抑制可怕的红色蠕变线条;-)如下:

interface FileReaderEventTarget extends EventTarget {
    result:string
}

interface FileReaderEvent extends Event {
    target: FileReaderEventTarget;
    getMessage():string;
}

然后在我的应用程序中:

reader.onload = function(fre:FileReaderEvent) {
    var data = JSON.parse(fre.target.result);
    ...
}

并且,直到lib.d.ts有所更改,我们仍然使用已知接口进行工作

编辑2019年12月:

有了此修复程序,您可能会得到

错误TS2322:类型'(this:FileReader,e:FileReaderEvent)=> void'不能分配给类型'(this:FileReader,ev:ProgressEvent)=>任何'。

如果是这样,只需更换

 interface FileReaderEvent extends Event {

 interface FileReaderEvent extends ProgressEvent {


10
截至2018
上旬仍未解决

6
仍未解决。2018
。– Jeff Huijsmans,

10
仍未解决。十一月4,2018
达维特

15

74

除了使用之外event.target.result,您还可以使用FileReader.result

例如,

const fileReader: FileReader = new FileReader();

fileReader.onload = (event: Event) => {
   event.target.result; // This is invalid
   fileReader.result; // This is valid
};

1
无法解析为json :(
roadev

@KimchiMan ..太好了。您能解释一下吗?
迪拉古隆

1
如果出现此错误<br>键入'string | ArrayBuffer'不能分配给'string'类型。类型'ArrayBuffer'不能分配给类型'string' <br/>> fileReader.result; +'';
Maravarman Manoharan

2
这应该是公认的答案,干净而且没有涉及黑客的行为
Bogdan Ionitza

1
实际上是它ProgressEvent<FileReader>,而不仅仅是Event...
–danger89

36

对于我的旧类型脚本,默认情况下参数“ imgsrc”具有任何类型。

因此,现在我将其设置为(imgsrc:any)。一切正常。

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

21

问题出在打字稿定义上。一个简单的作弊方法是:

let target: any = e.target; //<-- This (any) will tell compiler to shut up!
let content: string = target.result;

16

只需让TypScript知道您期望的类型。

解决方法是:

let reader = new FileReader();
reader.onload = function (event){
    let fileUrl = (<FileReader>event.target).result;
}

reader.result在这种情况下,您也可以使用


这是最好的解决方案
Adam Schneider

6

如果有人在寻找最简单的解决方案,那么 对我有用。

var reader:any,
target:EventTarget;
reader= new FileReader();
reader.onload = function (imgsrc){
//var fileUrl = imgsrc.target.result; //change to
var fileUrl = (imgsrc.target as FileReader).result; //cast to correct type
}

3

今天,这在TypeScript 2.1.1上对我有用

interface EventTarget { result: any; }

1
不错的解决方案,但是当我重新启动该解决方案时,它在lib.d.ts中给出了许多错误。它与真实的EventTarget接口冲突。
Revils

2

如果出现此错误,请
键入'string |。ArrayBuffer'不能分配给'string'类型。类型“ ArrayBuffer”不可分配给类型“字符串”

fileReader.result +''; //有效的
fileReader.result; //无效


2

我在角度问题上遇到了同样的问题 FileReader

解决方案非常简单(Typescript具有必需的类型)。您必须使用ProgressEvent<FileReader>。可以lib.dom.d.ts在打字稿安装中找到它,因此如果使用

lib: {
"dom"
}

在你的tsconfig.json

这是我必须使用它的代码:

function read(file: File) {
  const fileReader = new FileReader();
  fileReader.onloadend = function (e: ProgressEvent<FileReader>) {
    const arr = (new Uint8Array(parseInt(e.target.result.toString(), 10))).subarray(0, 4);
    var header = "";
    for (var i = 0; i < arr.length; i++) {
      header += arr[i].toString(16);
    }
    console.log(header);

    // Check the file signature against known types

  };
  fileReader.readAsArrayBuffer(file);
}


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对象


1

上面的解决方案不适合我与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')
};

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”样式来解决您的类属性。

您将必须定义局部变量。请参阅上面摘录中“配置文件”的定义和用法。


0

尝试这个。

event.target["result"]

尽管此代码可以解决OP的问题,但最好包含有关您的代码如何解决OP的问题的说明。这样,将来的访问者可以从您的帖子中学习,并将其应用于自己的代码。SO不是编码服务,而是知识资源。而且,更可能会推荐高质量,完整的答案。这些功能以及所有帖子都必须自成体系的要求,是SO作为平台的强项,可以将其与论坛区分开。您可以编辑以添加其他信息和/或在源文档中补充说明。
ysf
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.