2017-02-14 111 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) => { 
    // .... 
})