Ich bin neu im Typoskript. In meiner Durandal-Anwendung, die ich auf VS-2012 nach VS-2015 migriert habe, bedeutet Typoskript 0.9 zu Typoskript 1.8.4. Nach der Migration habe ich so viele Build-Fehler bekommen. Ich habe alle bis auf einen gelöst. Ich erhalte unten einen Build-Fehler für Ereignistypen.
FEHLER: "Build: Eigenschaft 'Ergebnis' existiert nicht für Typ 'EventTarget'"
Und der Code war genau so:
var reader:any,
target:EventTarget;
reader= new FileReader();
reader.onload = function (imgsrc){
var fileUrl = imgsrc.target.result;
}
"Imgsrc" nimmt ein Typereignis entgegen.
Es funktioniert gut mit Typoskript 0.9, aber mit 1.8.4 wird ein Fehler ausgelöst, da 'Ergebnis' für Typ 'EventTarget' nicht vorhanden ist. Kann jemand helfen, dies zu lösen.
Hinweis: "target: EventTarget" wird von lib.d.ts abgerufen
quelle
Anstatt zu verwenden
event.target.result
, können Sie einfach verwendenFileReader.result
.Zum Beispiel,
const fileReader: FileReader = new FileReader(); fileReader.onload = (event: Event) => { event.target.result; // This is invalid fileReader.result; // This is valid };
quelle
ProgressEvent<FileReader>
und nicht nurEvent
...Bei meinem alten Typenskript hat der Parameter "imgsrc" standardmäßig einen beliebigen Typ.
Also, jetzt habe ich es gemacht als (imgsrc: any). Es funktioniert gut.
var reader:any, target:EventTarget; reader= new FileReader(); reader.onload = function (imgsrc:any){ var fileUrl = imgsrc.target.result; }
quelle
Das Problem liegt bei den Typoskriptdefinitionen. Ein einfacher Cheat ist:
let target: any = e.target; //<-- This (any) will tell compiler to shut up! let content: string = target.result;
quelle
Lassen Sie TypScript einfach wissen, welchen Typ Sie erwarten würden.
Hier ist das Update:
let reader = new FileReader(); reader.onload = function (event){ let fileUrl = (<FileReader>event.target).result; }
Sie können
reader.result
stattdessen auch in diesem Fall verwendenquelle
Wenn jemand die einfachste Lösung zu finden , dann dies für mich gearbeitet.
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 }
quelle
Heute hat das bei TypeScript 2.1.1 bei mir funktioniert
interface EventTarget { result: any; }
quelle
Wenn dieser Fehler
auftritt, geben Sie 'string | ein ArrayBuffer 'kann nicht dem Typ' string 'zugewiesen werden. Der Typ 'ArrayBuffer' kann nicht dem Typ 'string' zugewiesen werden.
quelle
Ich hatte das gleiche Problem im Winkel mit einem
FileReader
.Die Lösung ist ziemlich einfach (Typescript hat den erforderlichen Typ). Du musst benutzen
ProgressEvent<FileReader>
. Es befindet sich imlib.dom.d.ts
in der Typoskript-Installation, daher sollte es global verfügbar sein, wenn Sie mit bauenlib: { "dom" }
in deinem
tsconfig.json
.Hier ist der Code, in dem ich ihn verwenden musste:
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); }
quelle
anstatt
this.localDbRequest.onsuccess = function (event) { const db = event.target.result; };
machen
this.localDbRequest.onsuccess = function (event) { const db = this.result; };
quelle
Auf das Zielobjekt kann wie folgt zugegriffen werden, um Fehler bis zur Behebung zu vermeiden:
reader= new FileReader(); reader.onload = function (imgsrc){ var fileUrl = imgsrc.target["result"]; }
Das Ziel als Javascript-Objekt behandeln
quelle
Die oben genannten Lösungen passten nicht zu meinem ähnlichen Problem mit IndexedDB, daher dachte ich, ich würde mitteilen, was in meinem Szenario funktioniert hat. Durch Ändern der
(event)
Funktionsargumente in konnte(event: any)
ich die Typfehler ignorieren.Beispielcode:
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') };
quelle
Dies ist eine Unterbrechungsänderung von Javascript / Typoskript.
Sie müssen lediglich "event.target.result" durch "this.result" ersetzen.
"this" bezieht sich hier auf den Kontext der Schnittstelle "MSBaseReader".
Unten ist mein Implementierungsauszug:
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));
Definition der "MSBaseReader" -Schnittstelle:
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; }
Definition der "FileReader" -Schnittstelle
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; }
Beachten Sie auch, dass aufgrund der Kontextänderung von "this" in "onload ()" auf Ihre klassenbasierten Definitionen in "reader.onload = function (event) {..." nicht zugegriffen werden kann. Dies bedeutet, dass Sie den Stil "this.class-property" nicht verwenden können, um Ihre Klasseneigenschaften zu adressieren.
Sie müssen eine lokale Variable definieren. Siehe die Definition und Verwendung von "Profil" im obigen Auszug.
quelle
Versuche dies.
event.target["result"]
quelle