Продолжая мои приключения, я нашел новый блокпост.Я пытаюсь определить для моего проекта конфигуратор / опцию проверки, но я получаю ошибку.Все работает (наберите все константы и т. Д.), Ожидайте выделенную ошибку.И я не вижу своей ошибки ^^
У меня есть объект конфигурации, основанный на нескольких подкатегориях, и объект валидатора, который использует некоторые из этих категорий для проверки их, если предлагаются варианты.
Когда я извлекаю валидатор (как 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