2017-02-28 74 views
0

我有以下package.json打字稿泛型函数和索引参数

{ 
    "name": "browserify-test", 
    "version": "1.0.0", 
    "description": "", 
    "main": "dist/index.js", 
    "typings": "dist/index.d.ts", 
    "scripts": { 
     "build:tsc": "tsc --outDir dist", 
     "build:browser": "browserify src/index.ts -p tsify --standalone MyLib > dist/myLib.js" 
    }, 
    "devDependencies": { 
     "browserify": "^14.0.0", 
     "tsify": "^3.0.0", 
     "typescript": "^2.1.5" 
    } 
} 

tsconfig.json

{ 
    "compilerOptions": { 
     "noImplicitAny": true, 
     "module": "commonjs", 
     "target": "ES5", 
     "emitDecoratorMetadata": true, 
     "experimentalDecorators": true, 
     "sourceMap": true, 
     "declaration": true 
    } 
} 

文件src/evets.d.ts

export interface MyEvent { 
    name: string 
} 

最后切入点src/index.js

import * as events from './events'; 

export class MyLibrary { 
    public test(eventInstance: events.MyEvent) { 
     console.log(eventInstance); 
     console.log(events); 
    } 
} 

构建纯打字稿版本的作品。 SO命令npm run build:tsc作品完美,但努力建立与browserify,所以调用npm run build:browser我得到以下错误:

> [email protected] build /home/aszmyd/tmp/browserify-test 
> browserify src/index.ts -p tsify --standalone MyLib > dist/myLib.js 

Error: Cannot find module './events' from '/home/aszmyd/tmp/browserify-test/src' 

似乎browserify不能正常消耗与d.ts扩展类型定义文件。


上面的例子在两种情况下WORKS

  1. index.ts我导入像这样:import * as events from './events.d;(注意结束.D

  2. 在i除去console.log(events);行(?!) - 它如何使用events.***类型但不能使用整个集合(别名)?


我想我在这里失踪的东西假,但即时通讯缺乏创意。

回答

1

运行

import * as events from './events'; 

尝试导入称为打字稿文件“events.ts”位于同一目录中导入文件。那是因为它是一个相对路径。

(进口./events.d将在同一目录中导入events.d.ts,解释了为什么“它的工作原理”)

要导入外部模块,import语句是使用模块名(不是路径)制成。因此,对于一个被称为“事件”模块,import语句会

import * as events from 'events' 

当导入外部模块,编译器会寻找一个定义文件“输入”模块。根据模块的结构,这个文件可能是一个内部模块定义,看起来像你的'event.d.ts'或外部模块定义文件,它更可能看起来像

declare module 'events' { 
    export interface MyEvent { 
     name: string 
    } 
} 
+0

谢谢!这是有道理的。但是,如果可以使用其他文件夹中的内部模块定义,请告诉我。即当'module.d.ts'文件不在同一个文件夹中时,我可以从'module'进行'导入*'吗?我假设编译器会查找'module.d.ts',然后查找'node_modules/module','../ node_modules/module'等,直到找到它。 –

+0

当然。使用以模块名称命名的子文件夹创建一个'typings'目录。将模块定义文件粘贴在该子文件夹中。在'tsconfig.json'中,确保'typings'不被排除在编译路径之外(即包括在内)。这就对了 –