在引用其他命名空间时导出环境声明中的命名空间

时间:2016-08-09 06:19:25

标签: typescript typescript-typings

我正在尝试为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/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(...)

1 个答案:

答案 0 :(得分:0)

这是使用export import ... = ...构造解决的。

(旁注:我还了解到并非@turf/helpers包中的所有功能都可以在@turf中使用,这些功能将以distanceToDegrees进行说明。)

我在turf命名空间中创建了一个嵌套的命名空间,然后显式声明应该从helpers命名空间中导出哪些声明:

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;
}

&#34;草皮&#34;单片模块声明保持不变:

declare module "turf" {
    export = turf;
}

&#34; @草皮/助手&#34;模块声明如下所示:

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
相关问题