打字稿泛型函数和索引参数

Typescript generic function and indexed argument

我关注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 的类型定义文件。


上面的例子WORKS有两种情况:

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

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


我想我在这里遗漏了一些虚拟的东西,但我缺乏想法。

运行

import * as events from './events';

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

(导入./events.d会在同一目录下导入events.d.ts,解释为什么"it works")

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

import * as events from 'events'

导入外部模块时,编译器会寻找定义文件,"typing"模块。根据模块的结构,此文件可能是内部模块定义,看起来像 'event.d.ts' 或外部模块定义文件,更可能看起来像

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