我使用yargs
来解析命令行参数。下面是代码:
import yargs from 'yargs';
import { hideBin } from 'yargs/helpers';
import { ArgType } from './types';
const argv = yargs(hideBin(process.argv))
.option('migrateName', {
alias: 'n',
description: 'migration name',
type: 'string',
})
.demandOption('migrateName')
.help()
.alias('help', 'h').parse();
console.log(argv.migrateName)
我得到一个编译错误:
Property 'migrateName' does not exist on type '{ [x: string]: unknown; migrateName: string; _: (string | number)[]; $0: string; } | Promise<{ [x: string]: unknown; migrateName: string; _: (string | number)[]; $0: string; }>'.
Property 'migrateName' does not exist on type 'Promise<{ [x: string]: unknown; migrateName: string; _: (string | number)[]; $0: string; }>'
migrateName
在argv上不存在。但是当查看argv
类型时,它有一个or
运算符。它的类型是:
{
[x: string]: unknown;
migrateName: string;
_: (string | number)[];
$0: string;
} | Promise<{
[x: string]: unknown;
migrateName: string;
_: (string | number)[];
$0: string;
}>
我不明白为什么typescript
抱怨这个类型,即使它已经有migrateName
在其类型。
我使用的版本是:
"@types/yargs": "^17.0.10",
"yargs": "^17.4.1",
"typescript": "^4.6.3"
1条答案
按热度按时间fslejnso1#
TL;DR使用yargs的
parseSync()
函数代替parse()
,或者在yargs前面加上await,例如const argv = await yargs(hideBin(process.argv))
。TypeScript * 实际上是在描述错误,它只是有点难以阅读,因为有一些重复的类型被扩展了。
你的整个错误是这样的:
如果我们仔细看,这个错误实际上有两行,并且有一堆重复的类型。
此类型在错误消息中重复三次:
这看起来像是您试图解析的CLI参数。
在我们的脑海中,让我们想象我们有一个该类型的别名-让我们称之为
Arguments
。如果我们在错误消息中使用假想的
Arguments
类型别名,我们会得到以下结果:现在看起来更清晰了!
yargs类型表示
parse()
函数可以返回参数本身或包含这些参数的promise。TypeScript错误是说你没有处理所有可能的返回类型。
如果返回了一个promise,那么它就不会有你试图访问的
migrateName
属性。解决方案
简单的解决方法是使用yargs的
parseSync()
函数而不是parse()
。