如何在TypeScript中使用commander(npm)?

时间:2016-05-13 01:14:00

标签: node.js typescript

我的应用上有以下代码:

import commander = require('commander');

commander
  .option('-u, --user [user]', 'user code')
  .option('-p, --pass [pass]', 'pass code')
  .parse(process.argv);

然后我尝试访问:

commander.user

但是我收到一个错误(来自DefinitelyTyped的commander.d.ts):

user does not exist on type IExportedCommand

我尝试添加此

interface IExportedCommand {
  user: string;
  pass: string;
}

但我仍然得到错误。我该如何解决这个问题?

4 个答案:

答案 0 :(得分:5)

使用以下内容创建文件commander-expansion.d.ts

declare namespace commander {
    interface IExportedCommand extends ICommand {
        user: string; 
        pass: string;
    }
}

提示

因为我最近做了类似的事情,所以推荐--auth user:password。保存您处理用户丢失的用户名或密码。但是阻止使用:作为密码属性

¯\_(ツ)_/¯

更多:https://github.com/alm-tools/alm/blob/master/src/server/commandLine.ts#L24

答案 1 :(得分:4)

你也可以这样做:

npm install --save @types/commander

答案 2 :(得分:1)

您可以将Typescript接口保留在同一个文件中。

interface InterfaceCLI extends commander.ICommand {
  user?: string
  password?: string
}

在运行program.parse函数后,可以将此接口定义为变量。

const cli: InterfaceCLI = program.parse(process.argv)
console.log(cli.user, cli.password)

我希望这有帮助!

答案 3 :(得分:0)

我知道这个话题很老,但是在寻求帮助方面遇到了很多麻烦。我已经解决了,但是我还是不太熟练使用Typescript或JavaScript,并希望获得一些反馈。

在阅读完上述答案后,我无法弄清 ICommand 类型的位置。但是我确实找到了一个类型名称 Command

此外,各种摘要使用的变量名不一致,这使得它们难以解读。

所以我玩了一段时间,想出了这个完整的例子。整个应用程序位于一个文件中:

import commander = require('commander');

interface InterfaceCLI extends commander.Command {
    user?: string
    password?: string
}
class Startup {
    public static main(): number {
        const cli: InterfaceCLI = commander
            .option('-u, --user [user]', 'user id')
            .option('-p, --password [password]', 'user\'s password')
            .parse(process.argv);
        console.log(cli.user, cli.password);

        return 0;
    }
}

Startup.main();

依赖项:install commander@2.16.0 --save

请让我知道您对这个解决方案的看法,因为我打算将其用作生产命令行应用程序的起点。