Экспорт пространств имен в объявлениях окружения при ссылке на другие пространства имен

Я пытаюсь создать объявление окружающего типа для Turf.js. Его можно импортировать из npm либо со всеми функциями, либо по частям, по одному модулю.

У меня есть основное пространство имен, которое содержит все объявления функций:

declare namespace turf {
    export function area(input: GeoJSON.Feature<any> | GeoJSON.FeatureCollection<any>): number;
    export function bearing(start: GeoJSON.Feature<GeoJSON.Point>, end: GeoJSON.Feature<GeoJSON.Point>): number;
    ...
    export function feature(geometry: GeoJSON.GeometryObject, properties?: any): GeoJSON.FeatureCollection<any>;
    export function point(coordinates: GeoJSON.Position, properties?: any): GeoJSON.Feature<GeoJSON.Point>;

}

Для монолитного экспорта я могу сделать это:

declare module "turf" {
    export = turf;
}

А для нормального поэтапного экспорта модулей я могу сделать так:

declare module "@turf/area" {
    export default turf.area;
}

declare module "@turf/bearing" {
    export default turf.bearing;
}

Который затем можно использовать следующим образом:

import bearing from "@turf/bearing";

В библиотеке turf также есть модуль @turf/helpers, который используется следующим образом:

import { feature, point } from "@turf/helpers"

Мой вопрос: как мне ввести экспорт модуля «@turf/helpers»? Я не хочу копировать определение типа, а использую те, которые уже есть в пространстве имен turf.

Самое близкое, что мне удалось достичь, это:

declare module "@turf/helpers" {
    export = {
        feature: turf.feature,
        point: turf.point,
    }
}

Но так как я не экспортирую модуль, я должен использовать формат import x = require(...) в своей реализации:

import helpers = require("@turf/helpers");
const { feature, point } = helpers;
feature(...)

person Yuri Feldman    schedule 09.08.2016    source источник


Ответы (1)


Это было решено с помощью конструкции export import ... = ....

(Примечание: я также узнал, что не все функции в пакете @turf/helpers были доступны в пакете @turf, что будет показано на примере distanceToDegrees.)

Я создал вложенное пространство имен в пространстве имен turf, а затем явно объявил, какие объявления следует экспортировать из пространства имен помощников:

declare namespace turf {
    ...
    namespace helpers {
        // Should be imported as turf.feature and turf.point
        export function feature(geometry: GeoJSON.GeometryObject, properties?: any): GeoJSON.FeatureCollection<any>;
        export function point(coordinates: GeoJSON.Position, properties?: any): GeoJSON.Feature<GeoJSON.Point>;
        ...
        // Should not be included in turf, only able to be imported from @turf/helpers
        export function distanceToDegrees(distance: number, unit?: Unit): number;
    }

    export import feature = helpers.feature;
    export import point = helpers.point;
}

Объявление монолитного модуля "turf" остается прежним:

declare module "turf" {
    export = turf;
}

А объявление модуля "@turf/helpers" выглядит так:

declare module "@turf/helpers" {
    import helpers = turf.helpers;
    export = helpers;
}

Итак, теперь поддерживаются оба варианта использования:

import * as turf from "turf";

import { feature, distanceToDegrees } from "@turf/helpers";

let geometry = {
  "type": "Point",
  "coordinates": [
    67.5,
    32.84267363195431,
  ],
};

turf.feature(geometry); // OK 
feature(geometry); // OK
turf.distanceToDegrees(10) // NOT OK
distanceToDegrees(10); // OK
person Yuri Feldman    schedule 10.08.2016