Перегруженное объявление вызывает ошибку сборки

#typescript #tsc

#typescript #tsc

Вопрос:

Я предоставил перегруженное объявление для postMessage представления подписи только для сообщений (а не версии lib.d.ts с тремя аргументами).

 declare function postMessage(message: any): void;
  

Я не получаю визуальных ошибок, красных закорючек и т. Д., Но я получаю ошибку сборки.

Сборка: предоставленные параметры не соответствуют какой-либо сигнатуре цели вызова.

Сборка: не удалось выбрать перегрузку для выражения ‘call’.

В этой строке:

 postMessage(message);
  

Это ошибка при выборе перегрузки, которую я предоставил, или я делаю что-то глупое?

Ответ №1:

Похоже на действительный отчет об ошибке для дополнения. Следующее работает нормально:

 declare function foo(message: any, targetOrigin: string, ports?: any): void;
declare function foo(message: any): void;

foo('asdf');
  

Но следующее приведет к ошибке при компиляции

 declare function postMessage(message: any): void;
postMessage('asdf');
  

То же самое для других функций в корне lib.d.ts , например:

 declare function blur(message: any): void;
blur('asdf');
  

Это почти так, как если declare бы оно даже не анализировалось. Следующее выдает ту же ошибку :

 postMessage('asdf');
  

Мгновенное решение

используйте no-default-lib ссылочный тег :

 /// <reference no-default-lib="true"/>
declare function postMessage(message: any): void;
postMessage('asdf');
  

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

1. Круто — я поднял это как ошибку: typescript.codeplex.com/workitem/2588 — Я также попытался добавить его в Window интерфейс. Радости тоже нет. Все работает на игровой площадке, поэтому, возможно, это уже исправлено для следующей версии.

2. Я полагаю, что ошибка может быть и в playground … языковая служба также работает в VS (что и использует playground) js tsc также генерируется… это то, что playground показывает на RHS

Ответ №2:

Временное решение…

Это временное решение для рабочих…

 (function(self: Worker){

    self.postMessage('a');

    self.postMessage({ etc: 'a' });

}(<any>self));
  

Не идеально, но это работает, потому Worker что интерфейс имеет правильное определение postMessage when в self контексте, а не window context .