5
votes

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

1 Answers

3
votes

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.