在 TypeScript 中设置来自 `process.argv` 的参数类型,没有类型断言

Set the types of the args from `process.argv` in TypeScript, without type assertions

如何在 TypeScript 中设置从 process.argv 传入的参数的类型,而不使用类型断言?因为使用 as 会强制类型,所以我想尽可能避免这种情况。

我现在拥有的:

type AppName = 'editor' | 'terminal';

function main(args: string[]): void {
  const app: AppName = args[0] as AppName;
}

main(process.argv.slice(2))

我想要的(伪代码):

type AppName = 'editor' | 'terminal';

function main(args: string[]): void {
  // This doesn't actually work, since `in` doesn't work on `type`.
  if (!(args[0] in AppName)) {
    throw new Error("The first argument is not an app name.")
  }

  // The error: Type 'string' is not assignable to type 'AppName'.
  const app: AppName = args[0];
}

main(process.argv.slice(2))

有没有类似的可能?有了条件,TS 应该检测到我已经确保第一个 arg 是给定的应用程序名称之一,因此接受将其设置为类型为 AppName.

的 var

一种方法是使用类型保护。 Here's 关于它的媒体文章

我知道该解决方案,但您可能有更好的解决方案

type AppName = 'editor' | 'terminal';

function isAppName(toBeDetermined: any): toBeDetermined is AppName {
  if (toBeDetermined === 'editor' || toBeDetermined === 'terminal') {
    return true
  }
  return false
} 

function main(args: string[]): void {
  if (!isAppName(args[0])) {
    throw new Error("The first argument is not an app name.")
  }

  const app = args[0]; // const app: AppName
}

Here 是它的工作场所