我在创建一个打字稿定义文件时遇到问题'简单'npm模块。
以下是详细信息:
问题:当我编译打字稿时,它会收到以下错误:
play.ts(1,9): error TS2305: Module '"/to/the/dir/node_modules/geojson/geojson"' has no exported member 'GeoJSON'.
模块:geojson(https://www.npmjs.com/package/geojson)。 该包只有一个公共功能。它位于文件geojson.js中:
(function(GeoJSON) {
GeoJSON.version = '0.3.0';
GeoJSON.defaults = {};
// The one and only public function.
// Converts an array of objects into a GeoJSON feature collection
GeoJSON.parse = function(objects, params, callback) {
...
...
...
(typeof module == 'object' ? module.exports : window.GeoJSON = {}));
package.json包含
"main": "./geojson",
"name": "geojson",
//// I ADDED THIS TYPE DEF FILE
"typings": "./geojson.d.ts",
从此我收集
我的定义文件是:geojson.d.ts
export declare module geojson {
interface GeoJSON {
parse(objects: any, params: any, callback?: any): any;
}
}
我的tsconfig文件是:
{
"compilerOptions": {
"target": "es5",
"module": "system",
"moduleResolution": "node",
"sourceMap": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"removeComments": false,
"noImplicitAny": false
}
}
我正在尝试导入(我尝试了1000种方法..)这里有一些:
import GeoJSON from 'geojson';
import geojson from 'geojson';
import {geojson} from geojson;
import geojson = require('geojson');
import GeoJSON = require('geojson');
我做错了什么?
答案 0 :(得分:1)
假设已经没有公开可用的类型 - 您的案例中的正确类型声明应如下所示。
您不应该编辑package.json
,而应该使用typings
工具消费打字,或者将以下类型定义保存在源文件夹中的something-or-other.d.ts
。我还建议将exclude: [ "node_modules" ]
添加到tsconfig.json
,以防止它处理node_modules
文件夹中的任何内容(目前它将以递归方式处理所有内容)。
模块本身没有任何命名空间或接口。请记住,在文件本身是一个“命名空间”(如果你来自.NET / Java等,这首先会令人困惑)
declare module 'geojson' {
export var version : string;
export var defaults: Object;
export function parse(data: Object, propreties: Object, callback?: Function) : Object;
}
这样消费:
import * as geoJson from 'geojson';
var data = [
{ name: 'Location A', category: 'Store', lat: 39.984, lng: -75.343, street: 'Market' },
{ name: 'Location B', category: 'House', lat: 39.284, lng: -75.833, street: 'Broad' },
{ name: 'Location C', category: 'Office', lat: 39.123, lng: -74.534, street: 'South' }
];
var result = geoJson.parse(data, {Point: ['lat', 'lng']});
console.log(result);
生成此JavaScript:
"use strict";
var geoJson = require('geojson');
var data = [
{ name: 'Location A', category: 'Store', lat: 39.984, lng: -75.343, street: 'Market' },
{ name: 'Location B', category: 'House', lat: 39.284, lng: -75.833, street: 'Broad' },
{ name: 'Location C', category: 'Office', lat: 39.123, lng: -74.534, street: 'South' }
];
var result = geoJson.parse(data, { Point: ['lat', 'lng'] });
console.log(result);
输出:
c:\code\tmp\geojson>node build\main.js
{ type: 'FeatureCollection',
features:
[ { type: 'Feature', geometry: [Object], properties: [Object] },
{ type: 'Feature', geometry: [Object], properties: [Object] },
{ type: 'Feature', geometry: [Object], properties: [Object] } ] }
查看我撰写的博客,其中包含有关打字发现等的更多信息:
http://ivanz.com/2016/06/07/how-does-typescript-discover-type-declarations-definitions-javascript/
这是一种“环境”类型声明,它将在文件中包含的文件中起作用。它告诉TypeScript“嘿,TypeScript - 存在一个名为geojson的模块,其中包含以下成员”。在您的情况下,该模块将是生活在node_modules
的NPM。
如果您是为本地javascript文件(不是npm包)或作为NPM包作者执行此操作,还有其他方法可以编写类型,这可以归结为编写“外部”模块类型声明,其中包含文件名(module.d.ts
,如果您有module.js
并且与module.js
位于同一目录中。在这种情况下,声明不会包含“声明模块”位,因为它直接绑定到.js文件。
答案 1 :(得分:0)
看起来您编写的模块定义未导出(公开发布)。
declare module 'geojson' {
export interface GeoJSON {
parse(objects: any, params: any, callback?: any): any;
}
}
然后你应该能够使用它来消费它:
import {GeoJSON} from 'geojson';
您是否考虑过在DefinitelyTyped中使用此库已有的类型?编辑:正如Paul在评论中提到的那样,唯一可用的类型似乎是GeoJson架构而不是库