创建打字稿定义文件的问题

时间:2016-06-08 13:42:59

标签: typescript angular

我在创建一个打字稿定义文件时遇到问题'简单'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",

从此我收集

  1. 模块名称:geojson
  2. parse:签名是解析(对象:any,params:any,callback?:any):any;
  3. GeoJSON是一个界面吗?
  4. 我的定义文件是: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');
    

    我做错了什么?

2 个答案:

答案 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架构而不是库