машинопись еще один тип не имеет подписи вызова - PullRequest
0 голосов
/ 01 октября 2018

Продолжая мои приключения, я нашел новый блокпост.Я пытаюсь определить для моего проекта конфигуратор / опцию проверки, но я получаю ошибку.Все работает (наберите все константы и т. Д.), Ожидайте выделенную ошибку.И я не вижу своей ошибки ^^

У меня есть объект конфигурации, основанный на нескольких подкатегориях, и объект валидатора, который использует некоторые из этих категорий для проверки их, если предлагаются варианты.

Когда я извлекаю валидатор (как val) и опции (как opt) в редукторе функции builder, они корректно приводятся, когда я пытаюсь использовать val в опциях, которые выдают мне ошибку ts 'Типу не хватает подписи вызова ' (подробное машинописное сообщение находится в конце кода)

// the option interface
interface Options {
  catA?: {optA1?: string, optA2?: number},
  catB?: {optB1?: RegExp, optB2?: number},
  catC?: {optC1?: string, optC2?: string},
}

// the default config
const Config: Options = {
  catA: {optA1: 'x',   optA2: 3  },
  catB: {optB1: /abc/, optB2: 2  },
  catC: {optC1: 'abc', optC2: 'a'},
}

// a keys helper function to get valid interface keys array as result
const _keys = <T extends {}>(o: T): (keyof T)[] =>
  Object.keys (o) as (keyof T)[]

// a validator object that takes only keys of options and returns a
// predicate for some of them
const Validators: {
  [P in keyof Options]: (x: Partial<Options[P]>) => boolean
} = {
  catA: ({optA1, optA2}) =>
    optA1 === undefined || optA1.length === 1               &&
    optA2 === undefined || optA2 > 0,
  catB: ({optB1, optB2}) =>
    optB1 === undefined || optB1.flags.indexOf ('i') >= 0   &&
    optB2 === undefined || optB2 > 0,
}

const builder = <T>(opts: Options) => {
  // builds the config
  const config = _keys (opts).reduce((conf, key) => {
    const opt = opts[key]
    // retrieve the validator for that key and if non provided
    // builds it as () => true
    const val = Validators[key] || (() => true)

    if (!opts[key]) return conf

    if (!val(opt)) throw Error('You have an error in option')
    //   ^^^^^^^^ => ts error: see comment below
    return {...conf, [key]: opts[key]}
  }, Config)

  return (data: T) => {
    // do something with data and config
  }
}

// detailed error is:
// [ts] Cannot invoke an expression whose type lacks a call signature.
//      Type '((x: Partial<{ optA1?: string; optA2?: number; }>) => boolean) |
//            ((x: Partial<{ optB1?: RegExp; optB2?: number; }>) => boolean) |
//            ((x: Partial<{ optC1?: string; optC2?: string; }>) => boolean)'
//      has no compatible call signatures.
// const val: ((x: Partial<{
//     optA1?: string;
//     optA2?: number;
// }>) => boolean) | ((x: Partial<{
//     optB1?: RegExp;
//     optB2?: number;
// }>) => boolean) | ((x: Partial<{
//   optC1?: string;
//   optC2?: string;
// }

Может быть тривиальным и, если вам так жаль, спрашиваю, во всех случаях спасибо зачтение, и если кто-то может указать мне мою ошибку, это было бы очень признателен;)

Спасибо Seb

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...