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 разных вещи и ТС не нацелен смотреть что написано у тебя в коде, можно попробовать написать обратный сопоставленный тип, но это займет много времени и совсем не нужно, больше как академическая задача
Обсуждают сегодня