NodeJS 为什么打字机不能识别或打字?

tf7tbtn2  于 2023-05-22  发布在  Node.js
关注(0)|答案(1)|浏览(152)

我使用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"
fslejnso

fslejnso1#

TL;DR使用yargs的parseSync()函数代替parse(),或者在yargs前面加上await,例如const argv = await yargs(hideBin(process.argv))

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()函数可以返回参数本身包含这些参数的promise。
TypeScript错误是说你没有处理所有可能的返回类型。
如果返回了一个promise,那么它就不会有你试图访问的migrateName属性。

解决方案

简单的解决方法是使用yargs的parseSync()函数而不是parse()

相关问题