G extends ((...args: any[]) => Promise<any>)[] | Record<PropertyKey, (...args: any[]) => Promise<any>>,
>(func: (getter: G extends any[] ? G[number] : G[keyof G], type: string) => Promise<any>, getters: G) {
if (Array.isArray(getters)) {
for (let idx = 0; idx < getters.length; idx++) {
await func(getters[idx], `value_${idx}`);
}
} else {
const entries = Object.entries(getters);
for (let idx = 0; idx < entries.length; idx++) {
await func(entries[idx][1], entries[idx][0]);
}
}
}
Ругается на первый параметр func. Хочется внутри func понимать, какие могут быть значения возвращены из getter
Playground
playground
это не то, что нужно - так внутри func getter всегда будет возвращать Promise<any>, а не то, что в getters
посмотри внимательнее, ты же хочешь func вызвать с тем что внутри getters, а это (...args: any[]) => Promise<any>
play вот что нужно было Вопрос ко всем: если в плейграунде убрать проверку на isFunction, начинает ругаться, если при этом из типа func убрать возвращаемый Promise - перестает ругаться (но промис нужен мне). Я решил тем, что в гварде isFunction поставил is Promise<any>, но я не понимаю, почему он ругается вообще
а что должно быть, все правильно ругается
Тип func определен: и параметры и результат, почему без гварда ругается? (Я его вообще для рантайма добавил...)
Argument of type 'PromiseFunc' is not assignable to parameter of type 'G extends any[] ? G[number] : ValueOf<G>' там же ошибка написана
Написана, но G подчиняется ограничениям из generic: и G[number], и ValueOf<G> и равны PromiseFunc. И непонятно, почему проверка func на возвращаемый промисс убирает ошибку
аргумент func имеет тип G extends any[] ? G[number] : ValueOf<G> по коду ты туда передаешь PromiseFunc что должен сделать компилятор ?
Оба выхода из тернарника дают PromiseFunk; более того, в ошибке, он из этого тернарника и определился (явно PromiseFunk нигде не передается, только в G
Хм, т.е. аргументы func теперь ...args:any[]? В этом есть смысл
Интересно то, что внутри func передаваемые типы getter определяются правильно (из фактически переданных вторым параметром в первую функцию)
не важно что дают оба выхода, ты тип описал для инстанса а не для реализации, декларация типа и реализация это 2 разных вещи и ТС не нацелен смотреть что написано у тебя в коде, можно попробовать написать обратный сопоставленный тип, но это займет много времени и совсем не нужно, больше как академическая задача
Обсуждают сегодня