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);
    }
}

构建纯打字稿版本的作品。所以命令npm run build:tsc完美运行,但尝试使用 browserify 构建,所以调用npm run build:browser我得到以下错误:

> browserify-test@1.0.0 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扩展名的类型定义文件。


上面的示例在两种情况下有效:

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

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


我认为我在这里错过了一些愚蠢的东西,但我缺乏想法。

4

1 回答 1

1

跑步

import * as events from './events';

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

(导入./events.devents.d.ts在同一个目录中导入,解释为什么“它有效”)

要导入外部模块,导入语句是使用模块名称(而不是路径)。因此,对于名为“事件”的模块,导入语句将是

import * as events from 'events'

导入外部模块时,编译器将查找定义文件,“键入”模块。根据模块的结构,这个文件可能是一个内部模块定义,看起来像你的“event.d.ts”,也可能是一个外部模块定义文件,看起来更像

declare module 'events' {
    export interface MyEvent {
        name: string
    }
}
于 2017-02-28T10:31:07.257 回答