Angular2 / TypeScript: ошибка TS2345: аргумент типа ‘String’ не может быть присвоен параметру типа ‘string’

#javascript #string #angular #typescript #wrapper

#javascript #string #angular #typescript #оболочка

Вопрос:

У меня есть следующий код, который я использую для создания системы управления казино:

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

Однако, когда я пытаюсь перенести этот код из TypeScript в 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 в угловых фигурных скобках, но я хочу иметь возможность продолжать в будущем, не создавая подобных ошибок, а также написать лучший код, который я могу… Итак, мне интересно, может ли кто-нибудь прояснить это для меня:

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

Почему было бы предпочтительнее использовать тип ‘string’ вместо типа ‘String’ в Angular2 / Typescript в таком общем смысле, как, по-видимому, подразумевает ошибка? Что делает это предпочтительным?

Комментарии:

1. попробуйте изменить его на new Subject<string>(); "small s"

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

3. Вы нашли решение? Я сталкиваюсь с той же проблемой.

4. На данный момент нет, но я собираюсь на небольшую конференцию в ближайшее время (выступаю с докладом! Wooottt!) и темой будет Angular2 и TypeScript, поэтому я поспрашиваю и посмотрю, знает ли кто-нибудь решение.

Ответ №1:

 private searchTerms = new Subject<String>();
  

измените его на

 private searchTerms = new Subject<string>();
  

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

Комментарии:

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

2. Subject метод / API выдаст данные позже. Subject<string>() таким образом, он указывает, какой тип данных будет отправлен. Обычно субъект может выдавать string type данные и, очевидно, не String class вводить данные. Итак…

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

4. трудно сказать, пока не заглянем внутрь определения объекта.