2016-10-23 8 views
3

Ich habe den folgenden Code, der ich ein Casino-Management-System zu schaffen, bin mit:Angular2/Typoskript: error TS2345: Argument vom Typ 'String' ist zu Parameter des Typs 'string' nicht belegbare

import { Component, OnInit } from '@angular/core'; 
import { Router }   from '@angular/router'; 
import { Observable }  from 'rxjs/Observable'; 
import { Subject }   from 'rxjs/Subject'; 

import { SearchService } from './search.service'; 
import { Data } from './datatypings'; 

@Component({ 
    moduleId: module.id, 
    selector: 'casino-search', 
    templateUrl: 'search.component.html', 
    styleUrls: [ 'search.component.css' ], 
    providers: [SearchService] 
}) 

export class SearchComponent implements OnInit { 

    data: Observable<Data[]>; 

    private searchTerms = new Subject<String>(); 

    constructor(
    private searchService: SearchService, 
    private router: Router) {} 
    // Push a search term into the observable stream 
    search(term: string): void { 
    this.searchTerms.next(term); 
    } 

    ngOnInit(): void { 
    this.data = this.searchTerms 
     .debounceTime(150)  // wait for 150ms pause in events 
     .distinctUntilChanged() // ignore if next search term is same as previous 
     .switchMap(term => term // switch to new observable each time 
     // return the http search observable 
     ? this.searchService.search(term) 
     // or the observable of empty data if no search term 
     : Observable.of<Data[]>([])) 
      .catch(error => { 
     // TODO: real error handling 
     console.log(error); 
     return Observable.of<Data[]>([]); 
     }); 
    } 

    gotoDetail(data: Data): void { 
    let link = ['/detail', data.id]; 
    this.router.navigate(link); 
    } 
} 

Allerdings, wenn ich diesen Code von Typoskript zu JavaScript transpile versuchen, bekomme ich diesen Fehler:

app/data/search.component.ts(37,37): error TS2345: Argument of type 'String' is not assignable to parameter of type 'string'. 
    'string' is a primitive, but 'String' is a wrapper object. Prefer using 'string' when possible. 

Nun, ich den Fehler behoben haben einfach durch String-string in den Winkel Klammern zu ändern, aber ich möchte in der Lage sein in Zukunft fortfahren, ohne ähnliche Fehler zu erzeugen, und a lso, um den besten Code zu schreiben, den ich kann ... Ich frage mich, ob jemand das für mich klären könnte:

Ich denke, ich verstehe, dass ein Parameter mit einer Wrapper-Klasse etwas ist, das eine primitive Klasse kapselt und einige bereitstellt eine Art von zusätzlichem, normalerweise in Verbindung stehendem, Verhalten (korrigiere mich, wenn ich hier falsch liege) und ich sehe, warum es dann nicht möglich ist, den Inhalt eines wesentlich breiteren deklarierten Variablentyps dem einfacheren Primitiv zuzuordnen ist ein weiterer Aspekt der Fehlermeldung, die mich interessiert, das heißt:

Warum wäre es vorzuziehen, Typ "String" über Typ "String" in Angular2/Typescript in einem solchen allgemeinen Sinne zu verwenden, wie der Fehler zu implizieren scheint? Was macht das bevorzugt?

+0

versuchen, es in 'new zu ändern Thema (); "kleines s" ' – micronyks

+0

Ja, ich habe es geändert, bevor ich die Frage gestellt habe. Was ich jedoch wissen wollte, ist, was die vordefinierte Wrapper-Klasse 'String' gegenüber dem primitiven' string'-Typ gemäß der Empfehlung in der Fehlermeldung bevorzugt. –

+0

Haben Sie die Lösung gefunden? Ich stehe vor dem gleichen Problem. –

Antwort

4
private searchTerms = new Subject<String>(); 

Änderung es

private searchTerms = new Subject<string>(); 

String ist ein class und string ein datatype ist.

+0

Ja, ich weiß. Was ist der Unterschied zwischen der Typescript-Bibliotheks-Klasse 'String' und dem TypeScript-Datentyp' string', was dazu führen sollte, dass ich den Datentyp über die Klasse in allen Fällen verwende, in denen dies möglich ist (wie in der Fehlermeldung) meine Frage. –

+0

'Subject' Methode/API wird später Daten ausgeben. 'Betreff ()' so sagt es, welche Art von Daten werden ausgegeben. Im Allgemeinen kann ein Subjekt "String-Typ" -Daten und offensichtlich keine "String-Class" -Daten ausgeben. So ... – micronyks

+0

Also ist es besser, die String-Wrapper-Klasse im Allgemeinen zu verwenden, da die zusätzlichen Daten in der Wrapper-Klasse nicht sauber miteinander verbunden sind (oder vielleicht?) Ich frage mich, ob die Wrapper-Klasse für die Schnittstelle "gemacht" werden kann ...) Betreff API? Vielleicht gibt es eine allgemeinere Regel darüber, keine zusätzliche Komplexität hinzuzufügen, indem eine Wrapperklasse verwendet wird, es sei denn, sie ist absolut erforderlich, und das Subject-Verfahren ist nur ein Beispiel für eine Wrapper-Klasse (ich nehme an, Subject ist auch eine Wrapper-Klasse?) wegen der zusätzlichen Komplexität, die der Wrapper hinzufügt? –

Verwandte Themen