Typescript泛型函数和索引参数

时间:2017-02-28 09:48:24

标签: typescript browserify tsify

我关注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'

浏览器似乎无法正确使用扩展名为d.ts的类型定义文件。

上述示例 WORKS 有两种情况:

  1. 在我index.ts i导入时:import * as events from './events.d;(请注意结尾 .d

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

  3. 我认为我在这里错过了一些假人,但我缺乏想法。

1 个答案:

答案 0 :(得分:1)

运行

import * as events from './events';

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

(导入./events.d会在同一目录中导入events.d.ts,解释原因"它有效")

要导入外部模块,将使用模块名称(而不是路径)创建import语句。因此,对于名为' events'的模块,import语句将是

import * as events from 'events'

导入外部模块时,编译器将查找定义文件,"输入"模块。根据模块的结构,这个文件可能是一个内部模块定义,看起来就像你的事件d .ts'或外部模块定义文件,更像是

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