Nouveau type 1.8.4 erreur de compilation: "Build: Property' result 'n'existe pas sur le type'EventTarget'. "

je suis nouveau à dactylographier. Dans mon application Durandal j'ai migré à VS-2012 à VS-2015 signifie tapescript 0.9 à typescript 1.8.4. Après avoir migré j'ai eu tellement d'erreurs de compilation. J'ai résolu tous ceux sauf un. J'obtiens ci-dessous build error sur les types d'événements.

message d'ERREUR: "Construire: la Propriété 'résultat' n'existe pas sur le type "EventTarget' "

Et le code est exactement comme ci-dessous:

var reader:any,
target:EventTarget;

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

"Imgsrc" prend type événement.

il fonctionne très bien avec typescript 0.9 mais avec 1.8.4 il lance une erreur car 'result' n'existe pas sur le type 'EventTarget'. Quelqu'un peut-il aider à résoudre.

Remarque: "la cible:EventTarget" est l'obtention de lib.d.ts

33
demandé sur Radim Köhler 2016-03-04 09:34:16

6 réponses

any est un médicament (presque pour n'importe quoi, mais... où est L'avantage de dactylographier alors)... il y a un problème similaire rapporté et nice (TypesScript-ish) solution de contournement proposé

Demande de changement de currentTarget dans l'interface d'Événement pour lib.d.ts

permettez-moi de citer:

J'ai trouvé ce TS2339: la propriété 'result' n'existe pas sur type "EventTarget" dans JS FileReader onload, et un autre avertissement pour getSummary() sur l'événement passé à FileReader de onerror.

mon travail autour, pour supprimer les lignes grises rouges horribles; -) est le suivantes:

interface FileReaderEventTarget extends EventTarget {
    result:string
}

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

Puis dans mon application:

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

et, jusqu'à un certain changement de lib.d.ts, nous continuons de travailler avec une interface connue

47
répondu Radim Köhler 2016-03-04 07:55:20

avec mon ancien script de type le paramètre "imgsrc" a n'importe quel type par défaut.

donc, maintenant je l'ai fait comme (imgsrc: any). Ça fonctionne très bien.

var reader:any,
target:EventTarget;
reader= new FileReader();
reader.onload = function (imgsrc:any){
var fileUrl = imgsrc.target.result;
}
19
répondu Rayudu 2016-03-04 07:32:42

au Lieu d'utiliser event.target.result, vous pouvez simplement utiliser FileReader.result.

Par exemple,

const fileReader: FileReader = new FileReader();

fileReader.onload = (event: Event) => {
   event.target.result; // This is invalid
   fileReader.result; // This is valid
};
16
répondu KimchiMan 2017-09-24 00:10:45

le problème est avec Le tapuscrit définitions. Un simple tricheur est:

let target: any = e.target; //<-- This (any) will tell compiler to shut up!
let content: string = target.result;
11
répondu tika 2017-08-02 04:59:32

Aujourd'hui cela a fonctionné pour moi à la typographie 2.1.1

interface EventTarget { result: any; }
2
répondu Elcio Mauro Guimarães 2016-12-10 04:54:43

il s'agit d'un changement radical de javascript/typescript.

ce que vous devez faire est de simplement remplacer "de l'événement.cible.suite" par "ce.résultat."

"ce" désigne ici le contexte de l'interface "MSBaseReader".

ci-dessous sont mes mise en œuvre de l'extrait:

      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 définition:

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;
}

interface"FileReader" définition

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;
}

notez également que, en raison du changement de contexte de "ce" dans " onload ()", vos définitions basées sur la classe ne sont pas accessibles dans " reader.onload = function (event){..."; ce qui signifie que vous ne pouvez pas utiliser".catégorie de la propriété" style pour répondre à vos propriétés de la classe.

vous devez définir la variable locale. voir la définition et l'utilisation de "profil" dans l'extrait ci-dessus.

0
répondu George Wang 2017-09-01 00:19:18