首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么打字稿不能识别或打字?

为什么打字稿不能识别或打字?
EN

Stack Overflow用户
提问于 2022-04-12 23:06:10
回答 1查看 235关注 0票数 0

我使用yargs解析命令行参数。以下是代码:

代码语言:javascript
复制
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)

我收到了一个编译错误:

代码语言:javascript
复制
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操作符。它的类型是:

代码语言:javascript
复制
{
    [x: string]: unknown;
    migrateName: string;
    _: (string | number)[];
    $0: string;
} | Promise<{
    [x: string]: unknown;
    migrateName: string;
    _: (string | number)[];
    $0: string;
}>

我不明白为什么typescript抱怨这种类型,即使它已经有了它的类型的migrateName

我使用的版本是:

代码语言:javascript
复制
"@types/yargs": "^17.0.10",
"yargs": "^17.4.1",
"typescript": "^4.6.3"
EN

Stack Overflow用户

回答已采纳

发布于 2022-04-12 23:27:48

TypeScript实际上是在描述错误,只是有点难读,因为有一些重复的类型已经被扩展了。

您所犯的全部错误是:

代码语言:javascript
复制
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; }>'

如果我们仔细观察,这个错误实际上有两行和一组重复的类型。

此类型在错误消息中重复三次:

代码语言:javascript
复制
{ [x: string]: unknown; migrateName: string; _: (string | number)[]; $0: string; }

这看起来像您试图解析的CLI参数。

在我们的头脑中,让我们想象一下,我们有一个这个类型的别名--让我们称之为Arguments

如果我们在错误消息中使用虚构的Arguments类型别名,就会得到以下结果:

代码语言:javascript
复制
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()

票数 3
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71850061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档