2017-02-14 8 views
1

Я пытаюсь следовать File Upload using (AngularJS 2) and ASP.net MVC Web APIнаблюдатель неявно имеет ошибку любого типа

из upload.service.ts (примечание: // ошибка добавляется рядом с линией ошибок)

import { Injectable } from '@angular/core'; 
import { Observable } from 'rxjs/Rx'; 

@Injectable() 
export class UploadService { 
    progress$: any; 
    progress: any; 
    progressObserver: any; 
    constructor() { 
     this.progress$ = Observable.create(observer//error => { 
      this.progressObserver = observer 
     }).share(); 
    } 

    private makeFileRequest(url: string, params: string[], files: File[]): Observable/error { 
     return Observable.create(observer//error => { 
      let formData: FormData = new FormData(), 
       xhr: XMLHttpRequest = new XMLHttpRequest(); 

      for (let i = 0; i < files.length; i++) { 
       formData.append("uploads[]", files[i], files[i].name); 
      } 

      xhr.onreadystatechange =() => { 
       if (xhr.readyState === 4) { 
        if (xhr.status === 200) { 
         observer.next(JSON.parse(xhr.response)); 
         observer.complete(); 
        } else { 
         observer.error(xhr.response); 
        } 
       } 
      }; 

      xhr.upload.onprogress = (event) => { 
       this.progress = Math.round(event.loaded/event.total * 100); 

       this.progressObserver.next(this.progress); 
      }; 

      xhr.open('POST', url, true); 
      xhr.send(formData); 
     }); 
    } 
} 

и получение ошибка:

Error TS7006 Parameter 'observer' implicitly has an 'any' type

Я пытался использовать

(observer:Observable <any>) => 

instaed из

(observer => 

и получил тезисы ошибки позиционирования

TS2339 Property 'next' does not exist on type 'Observable<any>' 
TS2339 Property 'error' does not exist on type 'Observable<any>' 
TS2339 Property 'complete' does not exist on type 'Observable<any>' 
TS7006 Parameter 'observer' implicitly has an 'any' type 

ответ

3

Ваш наблюдатель нуждается аргумент типа для его типа переменной T и это не типа Observable<T> но типа Observer<T>

Поскольку вы вызываете next с аргументом типа number, он должен быть Observer<number>:

import { Observer } from 'rxjs/Observer'; 

this.progress$ = Observable.create((observer: Observer<number>) => { 
    // ... 
}) 

Ваш второй наблюдаемый внутри makeFileRequest имеет тип string и поэтому для его компиляции потребуется Observer<string>.

2

Вы получите «„наблюдателя“параметра неявно имеет„любую“тип» ошибку, потому что вы не явно дать введите в свою переменную observer, и ваш компилятор TypeScript настроен на запрет этого.

Первое, что вы можете сделать, это явно дают тип к observer:

Observable.create((observer: any) => { 
    // .... 
}) 

Обратите внимание, что тип по-прежнему any, но теперь это явно не подразумевается. Это должно исправить ошибку.

Но было бы более точным, чтобы дать observer его реальный тип, который Observer:

import { Observer } from 'rxjs/Observer'; 

Observable.create((observer: Observer) => { 
    // .... 
})