【问题标题】:Issues creating a typescript definition file创建打字稿定义文件的问题
【发布时间】:2016-06-08 13:42:58
【问题描述】:

我在创建“简单”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. 解析:签名是解析(对象:任意,参数:任意,回调?:任意):任意;
  3. GeoJSON 是一个接口?

我的定义文件是: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');

我做错了什么?

【问题讨论】:

    标签: typescript angular


    【解决方案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 的模块,它具有以下成员”。在您的情况下,该模块将是一个 NPM 模块,位于 node_modules

    如果你是为本地 javascript 文件(不是 npm 包)或作为 NPM 包作者编写类型,还有其他方法可以编写类型,归结为编写具有文件名(module.d.ts 如果您有 module.js 并且与 module.js 位于同一目录中)。在这种情况下,声明将不包含“声明模块”位,因为它直接绑定到 .js 文件。

    【讨论】:

      【解决方案2】:

      看起来您编写的模块定义没有被导出(公开可用)。

         declare module 'geojson' {
              export interface GeoJSON {
                  parse(objects: any, params: any, callback?: any): any;
              }
         }
      

      然后你应该可以使用它:

      import {GeoJSON} from 'geojson';
      

      你有没有考虑过使用该库已经可用的分型? 编辑:正如 Paul 在 cmets 中提到的,唯一可用的分型似乎是用于 GeoJson 模式而不是库

      【讨论】:

      • 这个答案怎么会被否决?你试过这个保罗吗?
      • Paul 你能解释一下为什么你对我的回答投了反对票吗?虽然我同意@Ivan's 更完整,但我认为它不值得投反对票
      • @WayneRiesterer 我对它投了反对票,因为模块声明行不正确(此后已被编辑)并且还因为它实际上不起作用。是的,导入语句不会出错,但除此之外 - 它不会工作。如果我错了,请纠正我,我会立即撤消我的反对票:)
      • @tadwork 是我反对它。见上面的评论^^
      • @tadwork dt 上的 typedef 文件用于 geojson 模式 (geojson.org) 而不是 npm 包。感谢您的帮助
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-07
      • 2017-02-20
      • 1970-01-01
      • 2017-09-09
      • 2018-03-04
      • 2017-04-26
      • 1970-01-01
      相关资源
      最近更新 更多