Angular2+: TS выдает ошибку, если декорирую объявление метода. Но не всегда
Навешиваю на метод декоратор. В одном случае всё нормально работает:
@GET("/items") public getAll(): Observable<{}> { return null; }; А если не указываю тип, то получаю ошибку: TS1249:A decorator can only decorate a method implementation, not an overload TS2391:Function implementation is missing or not immediately following the declaration @GET("/items") public getAll(); Что за дела? |
Разобрался. Здесь { return null; } это тело функции, т.е. реализация есть.
Не понятно пока, что это за хак такой, когда пустая реализация используется. Повсеместно наблюдаю такой код |
Цитата:
|
А в чем смысл? Использовать разную реализацию в зависимости от входных параметров - это понятно. Но плодить пустые функции... Шаманством попахивает. Интерфейсы и абстрактные классы для сигнатур же используются.
Пока это выглядит как обход правила, не позволяющего декорировать неимплементированные методы |
Цитата:
get(url: string, options: { headers?: HttpHeaders, observe: 'response', params?: HttpParams, reportProgress?: boolean, responseType: 'arraybuffer', withCredentials?: boolean, }): Observable<HttpResponse<ArrayBuffer>>; get(url: string, options: { headers?: HttpHeaders, observe: 'response', params?: HttpParams, reportProgress?: boolean, responseType: 'blob', withCredentials?: boolean, }): Observable<HttpResponse<Blob>>; get(url: string, options: { headers?: HttpHeaders, observe: 'response', params?: HttpParams, reportProgress?: boolean, responseType: 'text', withCredentials?: boolean, }): Observable<HttpResponse<string>>; а если переписать вместе, получится каша get(url: string, options: { headers?: HttpHeaders, observe: 'response', params?: HttpParams, reportProgress?: boolean, responseType: 'arraybuffer' | 'blob' | 'text', withCredentials?: boolean, }): Observable<HttpResponse<ArrayBuffer>> | Observable<HttpResponse<Blob>> | Observable<HttpResponse<string>>; Цитата:
|
Странно, что в реализации http это без пустых функций работает.
Т.е., когда указываю export declare class HttpClient { get(...): Observable<...>; } это работает, а без declare export class HttpClient { get(...): Observable<...>; } пишет TS2391:Function implementation is missing or not immediately following the declaration Или это только для файлов деклараций справедливо .d.ts? В самом коде Ангуляра ничего такого нет, только реализация: get(url: string, options?: RequestOptionsArgs): Observable<Response> { return this.request( new Request(mergeOptions(this._defaultOptions, options, RequestMethod.Get, url))); } Что-то я запутался совсем( |
Shitbox2,
link Видна подсветка красным на 9 строке? add(5, 5) подходит под сигнатуру первой функции, add('1', '2') -- второй, add(true, false) -- такого определения нет. |
Подсветка есть. Пример понятен. Теперь вернемся к Ангуляру, к методу get из http (хороший пример)
Описанные выше сигнатуры расположены в файле client.d.ts, а сама имплементация в скомпиленных js-файлах. В исходниках же Ангуляра имплементация в файле http.ts и декларация непонятно где get(url: string, options?: RequestOptionsArgs): Observable<Response> { return this.request( new Request(mergeOptions(this._defaultOptions, options, RequestMethod.Get, url))); } Непонятно как это всё работает... И почему, вообще, работает |
Shitbox2,
Компилится в js, потому что приложение на angular 2 не обязательно должно быть написано на TS. Это может быть es5, es6, Dart. То есть разработчики написали свой код на ts, скомпилили в js и создали файлы декларации (.d.ts). Зачем нужны заголовочные файлы, думаю понятно. |
Это я ступил. Смотрел в исходниках http-сервис вместо того, чтобы открыть новый common/http-клиент. Поэтому и не сходилось ничего)
|
Часовой пояс GMT +3, время: 21:40. |