自动生成环境模块声明

Posted

技术标签:

【中文标题】自动生成环境模块声明【英文标题】:Automatically generating ambient module declarations 【发布时间】:2015-10-17 17:08:45 【问题描述】:

鉴于这 2 个打字稿文件

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';

但是,由于以下原因,此声明无法编译:Import or export declaration in an ambient module declaration cannot reference module through relative module name.

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

编辑

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

【问题讨论】:

【参考方案1】:

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

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 文件,该文件在package.json 中的definition 设置中定义。

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

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

import Token from 'api';

class foo 
    key: Token;

您可以使用 autodts link 使 reference path 保持最新状态,请查看博客文章和/或 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 为空白。

【讨论】:

感谢您的详细回答,并为迟到的回复道歉,我正在等待测试 TypeScript 1.6,它完全改变了交易。您的解决方案是 TypeScript github.com/Microsoft/TypeScript/issues/247 @BrunoGrieder github.com/Microsoft/TypeScript/wiki/Typings-for-npm-packages 真的不清楚。我一直在阅读关于 github 问题的 cmets 页面,但找不到这个非常简单问题的答案。使用 typescript > 1.6,例如,您是否应该编写一个使用“inversify”模块(类型化)的库,然后您还想在库之外使用 inversify。你是怎么做到的?? @David 我从未使用过 inversify,但你可以找到一个样板库 here 和我写的一些细节 there 和底部附近的一些类似 there

以上是关于自动生成环境模块声明的主要内容,如果未能解决你的问题,请参考以下文章

make--打造专业的编译环境

C#引入QT5环境下生成的DLL用不了,报错是无法加载 找不到指定模块

在 TypeScript 中使用单个模块生成声明文件

在线问题反馈模块实战:自动生成所有ControllerServiceMapper等文件

在线问题反馈模块实战:封装代码自动生成类文件器

在线问题反馈模块实战:自动生成所有ControllerServiceMapper等文件