Перегрузка метода Typescript, основанная на ограничениях длины массива - PullRequest
0 голосов
/ 28 февраля 2020

Здравствуйте, у меня есть проблема с типизацией Typescript - комбинация: - перегрузка метода - кортежи (массив известной длины) - ограничения типа - rx js (не обязательно)

У меня перегружен метод с этим определение:

function storeDomino<T1, T2>(
        actionDelegate: (x: T1) => Action,
        selectorDelegate: (x: T1) => MemoizedSelector<StoreType, T2, DefaultProjectorFn<T2>>,
        customShouldContinue?: (x: T1) => any)
        : OperatorFunction<T1, [T1, T2]>;

function storeDomino<T1, T2, T3>(
        actionDelegate: (x: [T1, T2]) => Action,
        selectorDelegate: (x: [T1, T2]) => MemoizedSelector<StoreType, T3, DefaultProjectorFn<T3>>,
        customShouldContinue?: (x: [T1, T2]) => any)
        : OperatorFunction<[T1, T2], [T1, T2, T3]>;

function storeDomino<T1, T2, T3, T4>(
        actionDelegate: (x: [T1, T2, T3]) => Action,
        selectorDelegate: (x: [T1, T2, T3]) => MemoizedSelector<StoreType, T4, DefaultProjectorFn<T4>>,
        customShouldContinue?: (x: [T1, T2, T3]) => any)
        : OperatorFunction<[T1, T2, T3], [T1, T2, T3, T4]>;

с использованием типа:

storeDomino(
          t1 => LoadOrderById({ id: t1.data.orderId }),
          t1 => selectOrderById(t1.data.orderId)
        ),
        storeDomino(
          ([t1, t2]) => LoadCatalogSpecificationById({ id: t2.data.entityCatalogSpecificationId }),
          ([t1, t2]) => selectCatalogSpecificationById(t2.data.entityCatalogSpecificationId)
        ),

        storeDomino(
          ([t1, t2, t3]) => LoadEntitySpecificationById({ id: t3.data.orderType.orderLineSpecId }),
          ([t1, t2, t3]) => selectCharacteristicsBySpecificationId(t3.data.orderType.orderLineSpecId)
        ),
        storeDomino(
          ([t1, t2, t3, t4]) => LoadEntitySpecificationById({ id: t4.data.entityInstanceSpecId }),
          ([t1, t2, t3, t4]) => selectCharacteristicsBySpecificationId(t4.data.entityInstanceSpecId)
        ),

Однако, вызовите с storeDomino (([t1, t2]) => ..), storeDomino ([t1,2t, t3]) => ...) переходит к первому переопределению только с T1 ..

Чтобы упростить вопрос .. можно ли обойти это в системе типов typecrip, создайте метод, который:

  • имеет несколько перегрузок
  • конкретная перегрузка выбирается исходя из количества элементов в кортеже
  • имеет другой тип возврата

Для упрощения вопроса подробнее .. Я просто хочу метод, который расширяет массив на 1 элемент и сохраняет их все СТРОГО типизированными ...

  • call ([число], _ => строка), // тип возвращаемого значения - [число, строка]
  • вызов ([число, строка], логическое значение] // тип возвращаемого значения: [число, строка, логическое значение]
...