2017-02-14 87 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>

既然你與number類型的參數調用next,它應該是一個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) => { 
    // .... 
})