08.08.2017, 12:04
|
Профессор
|
|
Регистрация: 04.10.2010
Сообщений: 571
|
|
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();
Что за дела?
Последний раз редактировалось Shitbox2, 08.08.2017 в 12:09.
|
|
08.08.2017, 12:12
|
Профессор
|
|
Регистрация: 04.10.2010
Сообщений: 571
|
|
Разобрался. Здесь { return null; } это тело функции, т.е. реализация есть.
Не понятно пока, что это за хак такой, когда пустая реализация используется. Повсеместно наблюдаю такой код
|
|
08.08.2017, 13:37
|
|
Профессор
|
|
Регистрация: 18.05.2011
Сообщений: 1,207
|
|
Цитата:
|
Не понятно пока, что это за хак такой, когда пустая реализация используется
|
Это не хак, а перегрузка функций. Т.е. сначала определяют несколько версий функций, которые не будут иметь никакой логики. Возможно с различным количеством или типом входных параметров, возвращаемым результатом, а затем определяют функцию с общей сигнатурой и в ней пишут логику работы.
|
|
08.08.2017, 14:03
|
Профессор
|
|
Регистрация: 04.10.2010
Сообщений: 571
|
|
А в чем смысл? Использовать разную реализацию в зависимости от входных параметров - это понятно. Но плодить пустые функции... Шаманством попахивает. Интерфейсы и абстрактные классы для сигнатур же используются.
Пока это выглядит как обход правила, не позволяющего декорировать неимплементированные методы
|
|
08.08.2017, 14:22
|
|
Профессор
|
|
Регистрация: 18.05.2011
Сообщений: 1,207
|
|
Цитата:
|
А в чем смысл? Использовать разную реализацию в зависимости от входных параметров - это понятно.
|
иногда бывает удобно делать так. Вот например перегрузка функции get из пакета http
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>>;
Цитата:
|
Но плодить пустые функции...
|
Ещё раз - функция будет одна. Всё что до реализации этой самой функции, для интерпретатора, чтобы он не ругался, когда я буду ждать тот или иной возвращаемый тип или передавать в функцию разные параметры.
|
|
08.08.2017, 14:56
|
Профессор
|
|
Регистрация: 04.10.2010
Сообщений: 571
|
|
Странно, что в реализации 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, 08.08.2017 в 15:07.
|
|
08.08.2017, 15:24
|
|
Профессор
|
|
Регистрация: 18.05.2011
Сообщений: 1,207
|
|
Shitbox2,
link
Видна подсветка красным на 9 строке? add(5, 5) подходит под сигнатуру первой функции, add('1', '2') -- второй, add(true, false) -- такого определения нет.
|
|
08.08.2017, 15:45
|
Профессор
|
|
Регистрация: 04.10.2010
Сообщений: 571
|
|
Подсветка есть. Пример понятен. Теперь вернемся к Ангуляру, к методу 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)));
}
Непонятно как это всё работает... И почему, вообще, работает
|
|
08.08.2017, 17:01
|
|
Профессор
|
|
Регистрация: 18.05.2011
Сообщений: 1,207
|
|
Shitbox2,
Компилится в js, потому что приложение на angular 2 не обязательно должно быть написано на TS. Это может быть es5, es6, Dart. То есть разработчики написали свой код на ts, скомпилили в js и создали файлы декларации (.d.ts). Зачем нужны заголовочные файлы, думаю понятно.
|
|
08.08.2017, 17:51
|
Профессор
|
|
Регистрация: 04.10.2010
Сообщений: 571
|
|
Это я ступил. Смотрел в исходниках http-сервис вместо того, чтобы открыть новый common/http-клиент. Поэтому и не сходилось ничего)
|
|
|
|