Используйте yargs с Typescript - PullRequest
0 голосов
/ 17 января 2020

Я не понимаю, когда я абстрагирую options в переменную (или даже импортирую из другого файла), Typescript жалуется на:

Argument of type '{ exclude: { type: string; required: boolean; description: string; default: never[]; alias: string; }; someOtherFlag: { type: string; required: boolean; description: string; default: never[]; }; }' is not assignable to parameter of type '{ [key: string]: Options; }'.
  Property 'exclude' is incompatible with index signature.
    Type '{ type: string; required: boolean; description: string; default: never[]; alias: string; }' is not assignable to type 'Options'.
      Types of property 'type' are incompatible.
        Type 'string' is not assignable to type '"string" | "number" | "boolean" | "array" | "count" | undefined'.ts(2345)
import * as yargs from 'yargs';

const options = {
  exclude: {
    type: 'array',
    required: false,
    description: 'Files to exclude',
    default: [],
    alias: 'e'
  },
  someOtherFlag: {
    type: 'array',
    required: false,
    description: 'Another example flag'
    default: []
  }
};

// throws Typescript error
const cliOptions = yargs.options(options).argv;

1 Ответ

0 голосов
/ 17 января 2020

Выполните одно из следующих действий (сначала используется as const):

const options = {...} as const 

// or 
const options = {
  exclude: { type: "array"  as "array", ...},
  someOtherFlag: { type: "array" as "array", ...}
} 

Объяснение:

Ваш options литерал передан yargs.options(options) кажется, что все в порядке, если посмотреть на его тип объявление .

Есть один важный момент, почему он не работает в текущей форме: options литеральный тип расширяется. Как следствие, type: 'array' становится type: string. yargs.options ожидает строковый литерал для type, поэтому здесь он взрывается.

Упомянутое расширение типа в основном происходит из-за проверки неизменности и отсутствия явного типа, если вы хотите узнать больше об этой теме c.

...