Lou*_*ché 5 node.js typescript definitelytyped node-commander
我尝试在打字稿中使用指挥官,我想为我的 cli 提供正确的类型。所以我从这段代码开始:
import * as program from "commander";
const cli = program
.version("1.0.0")
.usage("[options]")
.option("-d, --debug", "activate more debug messages. Can be set by env var DEBUG.", false)
.parse(process.argv);
console.log(cli.debug)
Run Code Online (Sandbox Code Playgroud)
但我收到此错误:
example.ts(9,17): error TS2339: Property 'debug' does not exist on type 'Command'.
Run Code Online (Sandbox Code Playgroud)
所以我尝试添加一个接口,如此处所述:
import * as program from "commander";
interface InterfaceCLI extends commander.Command {
debug?: boolean;
}
const cli: InterfaceCLI = program
.version("1.0.0")
.usage("[options]")
.option("-d, --debug", "activate more debug messages. Can be set by env var DEBUG.", false)
.parse(process.argv);
console.log(cli.debug)
Run Code Online (Sandbox Code Playgroud)
我收到这个错误:
example.ts(3,32): error TS2503: Cannot find namespace 'commander'.
Run Code Online (Sandbox Code Playgroud)
据我了解,cli实际上是一个类型的类commander.Command所以我尝试添加一个类:
import * as program from "commander";
class Cli extends program.Command {
public debug: boolean;
}
const cli: Cli = program
.version("1.0.0")
.usage("[options]")
.option("-d, --debug", "activate more debug messages. Can be set by env var DEBUG.", false)
.parse(process.argv);
console.log(cli.debug)
Run Code Online (Sandbox Code Playgroud)
这给了我这个错误:
example.ts(7,7): error TS2322: Type 'Command' is not assignable to type 'Cli'.
Property 'debug' is missing in type 'Command'.
Run Code Online (Sandbox Code Playgroud)
我不知道如何向类添加属性Command,无论是在我的文件中还是在新的 .d.ts 文件中。
使用您的第一个代码片段和以下依赖项,我没有收到错误:
"dependencies": {
"commander": "^2.11.0"
},
"devDependencies": {
"@types/commander": "^2.9.1",
"typescript": "^2.4.1"
}
Run Code Online (Sandbox Code Playgroud)
打字稿解释cli.debug为any. 我猜类型声明已经更新了。所以,如果你没问题any,问题就解决了。
如果你真的想告诉 Typescript 的类型debug,声明合并原则上是可行的方法。它基本上是这样工作的:
"dependencies": {
"commander": "^2.11.0"
},
"devDependencies": {
"@types/commander": "^2.9.1",
"typescript": "^2.4.1"
}
Run Code Online (Sandbox Code Playgroud)
但是,有一个问题:program.Command不是类型而是变量。所以,你不能这样做:
class C {
public foo: number;
}
interface C {
bar: number;
}
const c = new C();
const fooBar = c.foo + c.bar;
Run Code Online (Sandbox Code Playgroud)
虽然你可以这样做:
interface program.Command {
debug: boolean;
}
Run Code Online (Sandbox Code Playgroud)
你也不能这样做:
function f1(): typeof program.Command {
return program.Command;
}
type T = typeof program.Command;
function f2(): T {
return program.Command;
}
Run Code Online (Sandbox Code Playgroud)
也不是这个:
interface typeof program.Command {
}
Run Code Online (Sandbox Code Playgroud)
我不知道这个问题能否解决。
| 归档时间: |
|
| 查看次数: |
7440 次 |
| 最近记录: |