module - 自动生成环境模块声明

标签 module scripting typescript

给定这 2 个 typescript 文件

api/Token.ts

interface Token { 
    code: string
}
export default Token

index.ts

export * from './api/Token'

带有 --declarations 开关的 tsc 1.5 将生成两个 .d.ts 文件(具有相似的内容)

api/Token.d.ts

interface Token { 
    code: string;
}
export default Token;

index.d.ts

export * from './api/Token';

使用以下选项运行 grunt-dts-bundle

    dts_bundle: {
        release: {
            options: {
                name: 'my-module',
                main: 'index.d.ts'
            }
        }
    }

将生成一个包含以下内容的环境模块声明文件my-module.d.ts

declare module 'my-module' {
    export * from './api/Token';
}

但是由于以下原因,此声明无法编译:环境模块声明中的导入或导出声明无法通过相对模块名称引用模块。

我如何自动为上面的两个 typescript 文件生成环境模块声明?

编辑

请关注 https://github.com/Microsoft/TypeScript/issues/2262 上的最新更新

最佳答案

我最近写了一篇 blog post对这个。总而言之,您可以使用 autodts如果将 index.ts 替换为 api.ts,包含以下内容:

export {default as Token} from './api/Token';

确保 api.tsapi 目录位于同一位置(在其旁边,而不是在其内部)。

然后你需要一个package.json文件:

{
  "name": "api",
  "version": "1.0.0",
  "main": "dist/api.js",
  "scripts": {
    "preinstall": "npm install autodts",
    "postinstall": "autodts link",
    "prepublish": "tsc && autodts generate"
  },
  "typescript": {
    "definition": "index.d.ts"
  },
  "dependencies": {
    "autodts": "~0.0.4"
  },
  "devDependencies": {
    "@lib/autodts-generator": "~0.0.1",
    "typescript": "~1.5.3"
  }
}

包名 api 与文件 api.ts 和目录 api 匹配很重要。这样,在使用您的包时,Node.js 和 TypeScript 编译器将在相同的位置查找。

最后,你需要一个 tsconfig.json 文件:

{
    "compilerOptions": {
        "declaration": true,
        "module": "CommonJS",
        "target": "es5",
        "outDir": "dist"
    },
    "files": [
        "api.ts"
    ]
}

现在 npm install 将编译您的包并生成一个捆绑的 index.d.ts 文件,如 中的 definition 设置所定义>package.json.

要使用您的包,您可以执行以下操作:

/// <reference path = "api/index.d.ts" />

import {Token} from 'api';

class foo {
    key: Token;
}

您可以使用autodts 链接 使引用路径 保持最新,为此请查看博客文章和/或autodts 文档。

生成的 index.d.ts 包含:

/// <reference path="index.ref.d.ts" />
declare module 'api/Token' {
    interface Token {
        code: string;
    }
    export default Token;

}
declare module 'api' {
    export { default as Token } from 'api/Token';

}

index.ref.d.tsapi.js 都是空白。

关于module - 自动生成环境模块声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31654376/

相关文章:

python - 模块/导入包的路径

javascript - NestJS 中的模块

macos - Applescript 打开特定的终端样式窗口

javascript - 类型 'MyObject' 上不存在属性 - typescript 扩展

javascript - Angular 下拉菜单从硬编码数据切换到来自服务的实时数据

module - 对 rust 模块感到困惑

Python:如何从同名包中导入子模块?

powershell - 如何将 Powershell 函数作为参数分配给不同函数的参数

sql-server - 如何生成将使用数据重建 MS SQL Server 2005 数据库的脚本?

Typescript 通过鉴别器属性将已鉴别联合类型的数组分组到记录中