2016-10-23 2 views
3

У меня есть следующий код, который я использую для создания системы управления казино:Angular2/Машинопись: ошибка TS2345: Аргумент типа «String» не может быть назначен для параметра типа «строка»

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

Однако, когда я пытаюсь transpile этого кода из транскрипта JavaScript Я получаю эту ошибку:

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. 

Теперь, я исправил ошибку, просто изменив String к string в фигурных скобках угла, но я хочу, чтобы иметь возможность в будущем, не создавая подобных ошибок, и lso, чтобы написать лучший код, который я могу ... Поэтому мне интересно, может ли кто-то очистить это для меня:

Я думаю, что я понимаю, что параметр с классом-оболочкой является тем, что инкапсулирует примитивный класс и предоставляет некоторые (добавьте меня, если я ошибаюсь), и я понимаю, почему тогда было бы невозможно назначить содержимое того, что по существу является более широким объявленным типом переменной, более простой примитив, там является еще одним аспектом сообщения об ошибке, которое меня интересует, то есть:

Почему было бы предпочтительнее использовать тип 'string' над типом 'String' в Angular2/Typcript в таком общем смысле, как кажется, что ошибка? Что делает этот преференциальный?

+0

попытайтесь изменить его на 'new Subject (); «small s» ' – micronyks

+0

Да, я изменил его, прежде чем задал вопрос. Однако я хотел бы знать, что делает предопределенный класс-оболочку 'String' предпочтительнее примитивного типа' string', в соответствии с рекомендацией в сообщении об ошибке. –

+0

Вы нашли решение? Я столкнулся с той же проблемой. –

ответ

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

изменить его

private searchTerms = new Subject<string>(); 

String является class и string является datatype.

+0

Да, я знаю. В чем разница между классом библиотеки Typcript 'String' и строкой типа типа TypeScript, которая должна заставить меня использовать тип данных над классом во всех случаях, когда это возможно (в соответствии с сообщением об ошибке), однако, было мой вопрос. –

+0

Метод 'Subject'/API позже выдаст данные. 'Subject ()' поэтому он сообщает, какой тип данных будет испускаться. Обычно субъект может генерировать данные типа «string type» и, очевидно, не данные типа «String class». Итак ... – micronyks

+0

Так что лучше использовать класс обертки String вообще, потому что дополнительные данные в классе-оболочке не взаимодействуют чисто (или, возможно, вообще?) Интересно, может ли класс-оболочка быть «создан» для интерфейса, но это отдельно ...) Тема API? Возможно, существует более общее правило о том, что вы не добавляете дополнительную сложность, используя класс-оболочку, если это абсолютно необходимо, и проблема метода Subject является всего лишь одним примером одного класса-оболочки (я предполагаю, что Subject также является классом-оболочкой?), Взаимодействуя плохо или вообще не взаимодействуя из-за дополнительной сложности, добавленной оболочкой? –