Я начал работать над модернизацией файла декларации TypeScript библиотеки knockout
, который предоставляется проектом DefinitelyTyped
.
В файле объявления используются некоторые устаревшие методы, и из-за этого его неудобно использовать в приложении TypeScript 2.0+.
Текущий файл объявления содержит интерфейс с именем KnockoutStatic
. Все внутри этого должно быть в основном экспортировано с использованием формата export declare
var
/function
(если я правильно понимаю лучшие практики нового файла объявлений). Затем в конце файла должен быть оператор export as namespace ko;
, чтобы иметь возможность использовать его как внешний модуль.
Но переписывание всего интерфейса в этот формат — очень скучная работа, поэтому мне интересно, существует ли какой-нибудь трюк или синтаксис, чтобы захватить весь этот интерфейс и экспортировать его элементы, как если бы они были на верхнем уровне.
Я пробовал несколько вещей, например что-то вроде
declare var ko: KnockoutStatic;
export default ko;
Но это, конечно, привело к двум проблемам.
- Если я импортирую с помощью
import ko from "knockout"
, то я могу прекрасно использовать свой объектko
, но у меня нет доступа к таким интерфейсам, какKnockoutObservable<T>
и т. д. - Если я импортирую с помощью
import * as ko from "knockout;
, то у меня есть доступ к интерфейсам черезko.KnockoutObservable<T>
, что совершенно нормально, НО когда я хочу получить доступ к статическому материалу времени выполнения, я получаю другой уровень объектаko
при потреблении, какko.ko.observable
и т. д.
Другая проблема заключается в том, что если я перенесу весь материал KnockoutStatic
на верхний уровень, то больше нельзя будет добавлять методы, например, к ko
, так как нельзя расширить модуль, добавив в него экспорты верхнего уровня (по крайней мере, это было ограничение TypeScript). несколько месяцев назад, вдохновленный ограничением ES6). Так что с этой точки зрения интерфейсное решение лучше.
Важно отметить, что эта проблема довольно распространена, так как от этого явления страдают типизации многих популярных библиотек (даже таких, как jQuery
). Например, jQuery
также имеет интерфейс JQueryStatic
, который должен быть полностью "поднят" на один уровень IMO.
knockout
ни от чего не зависит, хотя в целом вы правы. - person Zoltán Tamási   schedule 06.01.2017