Automatically generating ambient module declarations

点点圈 提交于 2019-12-22 06:39:43

问题


Given these 2 typescript files

api/Token.ts

interface Token { 
    code: string
}
export default Token

and index.ts

export * from './api/Token'

tsc 1.5 with the --declarations switch will generate two .d.ts files (with similar content)

api/Token.d.ts

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

and index.d.ts

export * from './api/Token';

Running grunt-dts-bundle with the following options

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

will generate an ambient module declaration file my-module.d.ts with the following content

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

However this declaration does not compile due to : Import or export declaration in an ambient module declaration cannot reference module through relative module name.

How can I automatically generate an ambient module declaration for the two typescript files above ?

EDIT

Please follow latest updates on https://github.com/Microsoft/TypeScript/issues/2262


回答1:


I've recently written a blog post about this. To summarize, you can use autodts if you replace index.ts with api.ts, containing the following:

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

Make sure api.ts is in the same place as the api directory (next to, not inside it).

Then you need a package.json file:

{
  "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"
  }
}

It's important that the package name api matches the file api.ts and directory api. This way both Node.js and the TypeScript compiler will look in the same places when using your package.

Finally, you need a tsconfig.json file:

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

Now npm install will compile your package and produce a bundled index.d.ts file as defined in the definition setting in package.json.

To use your package, you can do something like:

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

import {Token} from 'api';

class foo {
    key: Token;
}

You can use autodts link to keep the reference path up to date, check the blog post and/or autodts docs for that.

The resulting index.d.ts contains:

/// <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.ts and api.js are blank.



来源:https://stackoverflow.com/questions/31654376/automatically-generating-ambient-module-declarations

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!