Подтвердить что ты не робот

Новая ошибка Typescript 1.8.4 build: "Build: Свойство" результат "не существует в типе" EventTarget "".

Я новичок в typescript. В моем приложении Durandal я перешел на VS-2012 в VS-2015, означая typescript от 0.9 до typescript 1.8.4. После миграции я получил так много ошибок сборки. Я разрешил всех тех, кроме одного. Я получаю ниже ошибки сборки для типов событий.

ОШИБКА: "Build: свойство" 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 он бросает ошибку, поскольку "результат" не существует в типе "EventTarget". Может ли кто-нибудь помочь в решении этой проблемы.

Примечание: "target: EventTarget" получает от lib.d.ts

4b9b3361

Ответ 1

В то время как any - это лекарство (почти для чего угодно, но... где это преимущество TypeScript)... есть аналогичная проблема, о которой сообщалось и хорошо (TypeScript-ish ) обходное решение

Запрос на изменение currentTarget в интерфейсе событий для lib.d.ts

позвольте мне привести:

Я столкнулся с этим TS2339: свойство 'result' не существует в типе "EventTarget" в JS FileReader onload и другое предупреждение для getSummary() в событии, переданном в FileReader onerror.

Моя работа, чтобы подавить ужасные красные squiggily lines;-) - это следующее:

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 мы все еще работаем с известным интерфейсом

Ответ 2

Вместо использования 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
};

Ответ 3

С моим старым типом script параметр "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

Просто дайте TypScript узнать, какого типа вы ожидаете.

Вот исправление:

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

Вы также можете использовать reader.result вместо этого в этом случае

Ответ 6

Сегодня это работало для меня в TypeScript 2.1.1

interface EventTarget { result: any; }

Ответ 7

вместо

    this.localDbRequest.onsuccess = function (event) {
      const db = event.target.result;
    };

делать

   this.localDbRequest.onsuccess = function (event) {
     const db = this.result;
   };

Ответ 8

К целевому объекту можно получить доступ, как показано ниже, чтобы предотвратить ошибку до исправления:

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

Обработка цели как объекта Javascript

Ответ 9

Если эта ошибка появляется
Тип 'строка | ArrayBuffer 'нельзя назначить типу' string '. Тип ArrayBuffer нельзя назначить типу string

fileReader.result+' ';//valid
fileReader.result;//invalid

Ответ 10

это изменение разрыва 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;
}

также отметим, что из-за изменения контекста "this" внутри "onload()" ваши определения на основе классов недоступны в "reader.onload = function (event) {..."; что вы не можете использовать стиль "this.class-property" для решения ваших свойств класса.

вам нужно будет определить локальную переменную. см. определение и использование "профиля" в приведенном выше отрывке.

Ответ 11

Вышеуказанные решения не подходили для моей аналогичной проблемы с 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')
};