2017-02-27 122 views
2

我正在构建一个打字稿项目并使用非打字稿库调用'draggabilly';Typescript在本地声明第三方模块

所以我试图自己声明。

这里是文件结构:

├── @types 
│ └── draggabilly 
│  └──index.d.ts 
├── node_modules 
├── package.json 
├── README.md 
├── src 
│ ├── index.ts 
│ └── application.ts 
└── tsconfig.json 

的src/application.ts

import * as Draggabilly from 'draggabilly'; 

new Draggabilly('#dragItem', { 
    // options... 
}); 

...... 

它表明

找不到声明文件模块 'draggabilly'。 '/node_modules/draggabilly/draggabilly.js' 隐含地具有'任何'类型。

所以我尝试创建本地声明文件:@类型/ draggabilly/index.d.ts:

export as namespace draggabilly; 

export = Draggabilly; 

declare class Draggabilly { 
    constructor(selector: string, options: any); 
} 

则包括tsconfig.json类型的路径:

{ 
    "compilerOptions": { 
     ...... 
     "typeRoots": [ 
      "./node_modules/@types", 
      "./@types" 
     ] 
    } 
} 

但错误仍然存​​在。所以我想知道什么是错在这里,什么是构建第三方模块申报文件在本地

我创建了一个示范库的这个问题在GitHub上的正确方法: https://github.com/ZheFeng/test-ts-types

问题不仅是如何我们在.d.ts文件内部定义,但打字稿根本找不到声明文件。

+0

结帐这个draggabilly分型https://github.com/giespaepen/draggabilly/blob/f40f08319eb2f8c8305a6207cf9afb731232dbfe/typings/draggabilly.d.ts –

+0

感谢Aivan,我做到了。但打字稿似乎没有识别我的声明文件。这就是为什么我把我的文件结构和配置上面。 – Zhe

回答

2

的问题是该行export = Draggabilly; - 你必须使用特定的打字稿语法import let = require("module")将其导入:

TypeScript documentation

当使用导出导入模块=,打字稿必须使用特定的import let = require("module")导入模块。

所以,你的进口应该是:

import Draggabilly = require("draggabilly");


如果你想使用ES6式导入,您可以修改您 index.d.ts象下面这样:

export as namespace draggabilly; 

export class Draggabilly { 
    constructor(selector: string, options: any); 
} 

...和进口它是这样的:

import * as draggabilly from 'draggabilly'; 

new draggabilly.Draggabilly('#dragItem', { 
    // options... 
}); 
+0

是的,你是对的。但问题是,即使我更改为导出类Draggabilly,错误仍然存​​在说“无法找到模块的声明文件'draggabilly'。'/node_modules/draggabilly/draggabilly.js'隐式具有'任何'类型”。这似乎打字稿忽略我的本地声明文件 – Zhe

+0

你可以用你的确切代码来更新你的文章。我似乎无法重现错误。 – Saravana

+0

感谢您的帮助Saravana。我在github上为这个问题创建了一个演示库:https://github.com/ZheFeng/test-ts-types – Zhe

0

Wh en作为第三方模块,该模块提供声明文件非打字稿为主,申报模块必须在全球范围内,和申报模块之外没有进口出口

// @types/draggabilly/index.d.ts 
declare module "draggabilly" { 
    class Draggabilly { 
     constructor(selector: string, options: any); 
    } 

    export = Draggabilly; 
} 

// src/application.ts 
import Draggabilly = require("draggabilly"); 

new Draggabilly("#dragItem", { 
    // options... 
});