我使用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"发布于 2022-04-12 23:27:48
TypeScript实际上是在描述错误,只是有点难读,因为有一些重复的类型已经被扩展了。
您所犯的全部错误是:
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; }>'如果我们仔细观察,这个错误实际上有两行和一组重复的类型。
此类型在错误消息中重复三次:
{ [x: string]: unknown; migrateName: string; _: (string | number)[]; $0: string; }这看起来像您试图解析的CLI参数。
在我们的头脑中,让我们想象一下,我们有一个这个类型的别名--让我们称之为Arguments。
如果我们在错误消息中使用虚构的Arguments类型别名,就会得到以下结果:
Property 'migrateName' does not exist on type 'Arguments | Promise<Arguments>'.
Property 'migrateName' does not exist on type 'Promise<Arguments>'现在看起来更清楚了!
yargs类型表示,parse()函数可以返回参数本身或,这是包含这些参数的承诺。
TypeScript错误是说您没有处理所有可能的返回类型。
如果承诺被返回,那么它将没有您要访问的migrateName属性。
溶液
简单的解决办法是使用亚尔格的parseSync()函数而不是parse()。
https://stackoverflow.com/questions/71850061
复制相似问题