Как я могу обновить файл ввода Knockout, чтобы он был совместим с TypeScript 2.0?

Я начал работать над модернизацией файла декларации TypeScript библиотеки knockout, который предоставляется проектом DefinitelyTyped.

В файле объявления используются некоторые устаревшие методы, и из-за этого его неудобно использовать в приложении TypeScript 2.0+.

Текущий файл объявления содержит интерфейс с именем KnockoutStatic. Все внутри этого должно быть в основном экспортировано с использованием формата export declare var/function (если я правильно понимаю лучшие практики нового файла объявлений). Затем в конце файла должен быть оператор export as namespace ko;, чтобы иметь возможность использовать его как внешний модуль.

Но переписывание всего интерфейса в этот формат — очень скучная работа, поэтому мне интересно, существует ли какой-нибудь трюк или синтаксис, чтобы захватить весь этот интерфейс и экспортировать его элементы, как если бы они были на верхнем уровне.

Я пробовал несколько вещей, например что-то вроде

declare var ko: KnockoutStatic;
export default ko;

Но это, конечно, привело к двум проблемам.

  1. Если я импортирую с помощью import ko from "knockout", то я могу прекрасно использовать свой объект ko, но у меня нет доступа к таким интерфейсам, как KnockoutObservable<T> и т. д.
  2. Если я импортирую с помощью import * as ko from "knockout;, то у меня есть доступ к интерфейсам через ko.KnockoutObservable<T>, что совершенно нормально, НО когда я хочу получить доступ к статическому материалу времени выполнения, я получаю другой уровень объекта ko при потреблении, как ko.ko.observable и т. д.

Другая проблема заключается в том, что если я перенесу весь материал KnockoutStatic на верхний уровень, то больше нельзя будет добавлять методы, например, к ko, так как нельзя расширить модуль, добавив в него экспорты верхнего уровня (по крайней мере, это было ограничение TypeScript). несколько месяцев назад, вдохновленный ограничением ES6). Так что с этой точки зрения интерфейсное решение лучше.

Важно отметить, что эта проблема довольно распространена, так как от этого явления страдают типизации многих популярных библиотек (даже таких, как jQuery). Например, jQuery также имеет интерфейс JQueryStatic, который должен быть полностью "поднят" на один уровень IMO.


person Zoltán Tamási    schedule 04.01.2017    source источник
comment
Проблема с обновлением объявлений типа Knockout заключается в том, что существует длинная строка глобально написанных файлов объявлений для таких вещей, как JQuery и тому подобное, которые каким-то образом зависят от них. Я подозреваю, что именно поэтому он не был переписан.   -  person Daniel Rosenwasser    schedule 06.01.2017
comment
На самом деле knockout ни от чего не зависит, хотя в целом вы правы.   -  person Zoltán Tamási    schedule 06.01.2017
comment
Тем временем я задал более общий технический вопрос о руководстве по обновлению существующих файлов типизации в соответствии с текущими рекомендациями github.com/Microsoft/TypeScript/issues/13294   -  person Zoltán Tamási    schedule 06.01.2017
comment
Knockout 3.5 будет включать файл объявления TypeScript с использованием современных технологий.   -  person Michael Best    schedule 01.05.2018
comment
@MichaelBest да, я знаю, спасибо, что указали на это здесь. Не могли бы вы опубликовать это как ответ, чтобы я мог закрыть этот вопрос?   -  person Zoltán Tamási    schedule 02.05.2018