2017-02-14 2 views
1

I File Upload using (AngularJS 2) and ASP.net MVC Web APIBeobachter implizit hat eine jede Art Fehler

von upload.service.ts zu folgen versuche (Anmerkung: // Fehler wird neben der Fehlerzeile hinzugefügt)

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

und bekommen ein Fehler:

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

ich versuchte

(observer:Observable <any>) => 
012 zu verwenden,

instaed von

(observer => 

und bekam Thesen Fehler

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 

Antwort

3

Ihre Observer eine Art Argument muss für seine variable T geben und es ist nicht vom Typ Observable<T> aber vom Typ Observer<T>

:

Da bist du next mit einem Argument vom Typ number aufrufen, sollte es ein Observer<number> sein

import { Observer } from 'rxjs/Observer'; 

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

Ihre zweite Observable innerhalb makeFileRequest hat den Typ string und müsste daher eine Observer<string> korrekt kompilieren.

2

Sie erhalten die „Parameter‚Beobachter‘implizit ein‚jeden‘Typ hat“ Fehler, weil Sie nicht explizit eine geben Geben Sie Ihre observer Variable ein, und Ihr TypeScript-Compiler ist so konfiguriert, dass dies nicht zulässig ist.

Das erste, was Sie tun können, ist explizit einen Typ observer geben:

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

Beachten Sie, dass der Typ noch any ist aber jetzt ist es explizit, nicht implizit. Das sollte den Fehler korrigieren.

Aber es wäre genauer observer seine wahre Art zu geben, die Observer ist:

import { Observer } from 'rxjs/Observer'; 

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