TypeScript declarations

Разница в поведении или как научить IDE подсказкам

TypeScript славится хорошей поддержкой в правильных хороших IDE. В частности, я использую WebStorm/PhpStorm. Бывает, что хочется не указывать тип у переменной (хотя это плозая практика), так как мы используем функцию с генериком и по смыслу понятно что тип заранее известен и другой уже не должен вернуться. Давайте покажу на примере, чтобы было понятнее. Как говорится, дано:

И мы получаем неработающий результат, хотя и ожидали другого:

Нет подсказок от интерфейса ComponentButton

Варианты решения проблемы, не залезая в декларацию и не разбираясь что там:

И вот мы получили результат, который хотели:

Круто круто, все работает! Есть подсказки =)

Но правильно ли это? Мы же не исправили проблему в корне, а просто обошли правила, точнее подогнали их под себя. Все это правится в корне и вся соль кроется в самой декларации. Мы указали что у нас require некая переменная типа функция с аргументами и неким результатом. А надо указать что у нас функция, а не перменная! Т.е. мы пишем вместо

declare var require: <T>(s :string) => T;

вот это вот все:

declare function require<T>(s :string): T;

Вот теперь у нас все будет работать без typecast и прочих подсказок компилятору:

Вот теперь все работает как надо и без подсказок.

Мораль

Описывайте правильно ваши декларации. =)

П.С.: функция require дана для примера.