我试图为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"
我的问题是,如何键入“@truf/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(...)
最佳答案
这是用export import ... = ...
结构解决的。
(SeNoTo:我也了解到,@turf/helpers
包中的所有功能并没有在@turf
中得到,这将用distanceToDegrees
来说明。
我在草皮名称空间中创建了一个嵌套的名称空间,然后显式地声明应该从助手命名空间中导出哪些声明:
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;
}
“草皮”单片模块声明保持不变:
declare module "turf" {
export = turf;
}
“@草皮/助手”模块声明如下:
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