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
