Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 08.08.2017, 12:04
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 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.
Ответить с цитированием
  #2 (permalink)  
Старый 08.08.2017, 12:12
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

Разобрался. Здесь { return null; } это тело функции, т.е. реализация есть.

Не понятно пока, что это за хак такой, когда пустая реализация используется. Повсеместно наблюдаю такой код
Ответить с цитированием
  #3 (permalink)  
Старый 08.08.2017, 13:37
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

Цитата:
Не понятно пока, что это за хак такой, когда пустая реализация используется
Это не хак, а перегрузка функций. Т.е. сначала определяют несколько версий функций, которые не будут иметь никакой логики. Возможно с различным количеством или типом входных параметров, возвращаемым результатом, а затем определяют функцию с общей сигнатурой и в ней пишут логику работы.
Ответить с цитированием
  #4 (permalink)  
Старый 08.08.2017, 14:03
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

А в чем смысл? Использовать разную реализацию в зависимости от входных параметров - это понятно. Но плодить пустые функции... Шаманством попахивает. Интерфейсы и абстрактные классы для сигнатур же используются.

Пока это выглядит как обход правила, не позволяющего декорировать неимплементированные методы
Ответить с цитированием
  #5 (permalink)  
Старый 08.08.2017, 14:22
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 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>>;


Цитата:
Но плодить пустые функции...
Ещё раз - функция будет одна. Всё что до реализации этой самой функции, для интерпретатора, чтобы он не ругался, когда я буду ждать тот или иной возвращаемый тип или передавать в функцию разные параметры.
Ответить с цитированием
  #6 (permalink)  
Старый 08.08.2017, 14:56
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 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.
Ответить с цитированием
  #7 (permalink)  
Старый 08.08.2017, 15:24
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

Shitbox2,
link
Видна подсветка красным на 9 строке? add(5, 5) подходит под сигнатуру первой функции, add('1', '2') -- второй, add(true, false) -- такого определения нет.
Ответить с цитированием
  #8 (permalink)  
Старый 08.08.2017, 15:45
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 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)));
  }


Непонятно как это всё работает... И почему, вообще, работает
Ответить с цитированием
  #9 (permalink)  
Старый 08.08.2017, 17:01
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

Shitbox2,
Компилится в js, потому что приложение на angular 2 не обязательно должно быть написано на TS. Это может быть es5, es6, Dart. То есть разработчики написали свой код на ts, скомпилили в js и создали файлы декларации (.d.ts). Зачем нужны заголовочные файлы, думаю понятно.
Ответить с цитированием
  #10 (permalink)  
Старый 08.08.2017, 17:51
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

Это я ступил. Смотрел в исходниках http-сервис вместо того, чтобы открыть новый common/http-клиент. Поэтому и не сходилось ничего)
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выдает ошибку. Что делать? octavian Общие вопросы Javascript 1 20.02.2010 12:13
insertBefore выдаёт ошибку и не работает на опере и фоксе SunnyDay Общие вопросы Javascript 3 19.09.2008 12:08