網站搜尋

typescript1.8 - 新的 Typescript 1.8.4 編譯錯誤:“編譯:類型 'EventTarget' 上不存在屬性 'result'。”


我對 TypeScript 很陌生。在我的 Durandal 應用中,我將 VS-2012 遷移到 VS-2015,也就是從 TypeScript 0.9 遷移到 TypeScript 1.8.4。遷移之後,我遇到了很多編譯錯誤。我解決了所有錯誤,除了其中一個。我在事件類型上遇到了以下編譯錯誤。

錯誤:" 建構:屬性 '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 獲取的

答案#1

你可以直接使用 FileReader.result,而不是使用 event.target.result。

例如,

const fileReader: FileReader = new FileReader();

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

答案#2

雖然 any 是一種藥物 (幾乎適用於任何情況,但……那 TypeScript 的好處在哪裡呢)……已有類似問題被反映,並且建議了不錯的 (TypeScript 風格) 解決方法

請求修改 lib.d.ts 中 Event 介面的 currentTarget

讓我引用:

我在 JS FileReader 的 onload 中遇到了這個 TS2339:類型 '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) => any'。

如果是這樣,只需更換

 interface FileReaderEvent extends Event {

和

 interface FileReaderEvent extends ProgressEvent {

答案#3

在我舊的 TypeScript 中,參數 "imgsrc" 預設是任何類型。

所以,現在我把它設為 (imgsrc:any)。它運作正常。

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

答案#4

問題出在 TypeScript 定義上。一個簡單的作弊方法是:

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

答案#5

只要讓 TypeScript 知道你期望它是什麼類型即可。

這裡是修正方法:

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

在這種情況下,你也可以改用 reader.result