Установите типы аргументов из `process.argv` в TypeScript без утверждений типа - PullRequest
1 голос
/ 23 октября 2019

Как я могу в 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 должен обнаружить, что я уже удостоверился, что первый аргумент является одним из заданных имен приложения, и, следовательно, принять установку его на переменную с типом AppName.

1 Ответ

0 голосов
/ 23 октября 2019

Один из способов сделать это - использовать охрану типа. Вот статья в среде об этом

Я знаю об этом решении, но у вас может быть что-то лучше

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
}

Здесь это рабочая площадка для него

...