Typescript泛型函数和索引参数

Typescript泛型函数和索引参数,typescript,browserify,tsify,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": "brow

我有以下
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"
    }
}
{
    "compilerOptions": {
        "noImplicitAny": true,
        "module": "commonjs",
        "target": "ES5",
        "emitDecoratorMetadata": true,
        "experimentalDecorators": true,
        "sourceMap": true,
        "declaration": true
    }
}
下面是
tsconfig.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"
    }
}
{
    "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
的类型定义文件


上述示例在两种情况下均有效:

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

  • 当我删除
    console.log(事件)时行(?!)-如何使用
    事件。***
    类型,但不能使用整个集合(别名)


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

    跑步

    import * as events from './events';
    
    尝试导入名为“events.ts”的typescript文件,该文件与导入文件位于同一目录中。这是因为它是一条相对路径

    (导入
    /events.d
    将导入同一目录中的
    events.d.ts
    ,解释“它工作”的原因)

    要导入外部模块,可以使用模块名称(而不是路径)执行import语句。因此,对于名为“events”的模块,import语句将是

    import * as events from 'events'
    
    导入外部模块时,编译器将查找定义文件,“键入”模块。根据模块的结构,该文件可能是一个类似于“event.d.ts”的内部模块定义文件,也可能是一个类似于“event.d.ts”的外部模块定义文件

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

    谢谢这是有道理的。但您能告诉我是否可以使用其他文件夹中的内部模块定义吗。也就是说,当
    module.d.ts
    文件不在同一文件夹中时,我是否可以将
    import*作为“模块”
    中的某物导入?我假设编译器查找
    module.d.ts
    ,然后查找
    node\u modules/module
    。/node\u modules/module
    等,直到找到它的答案。创建一个
    typings
    目录,其中包含以模块名称命名的子文件夹。将模块定义文件粘贴到该子文件夹中。在
    tsconfig.json
    中,确保编译路径中未排除
    typings
    (即包括在内)。就这样