Здравствуйте, у меня есть проблема с типизацией 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 ([число], _ => строка), // тип возвращаемого значения - [число, строка]
- вызов ([число, строка], логическое значение] // тип возвращаемого значения: [число, строка, логическое значение]