Как указано ниже, скажем, у нас есть:
- функция
r
, которая объединяет несколько задач вместе
- и функция
o
, которая возвращает форму, подобную when(cb).map(cb)
каждый обратный вызов, передаваемый when
или map
, всегда должен принимать следующие 3
аргументы: S, A, C
, где S
и C
определены в r
, а A
определены в o
.
вот ссылка на площадку для машинописи , которая также показывает ошибку, которую я получаю.
Мой вопрос: Как я могу получить безопасную декларацию?
type Task<S, A, C> = <AA extends A>(s: S, a: AA, c: C) => any;
type Fn<S, A, C> = (s: S, a: A, c: C) => any;
const r = <S, C>() => ({
tasks: (...tasks: Task<S, any, C>[]) => null,
});
const o = <T, A = { prop: T }>(type: T) => ({
when: <S, C>(fp: Fn<S, A, C>) => ({
map: <SS extends S, CC extends C>(fn: Fn<SS, A, CC>): Task<SS, A, CC> => (
(s: SS, a: A, c: CC): any => (
fp(s, a, c) ? fn(s, a, c) : s
)
),
}),
});
const result = r<2, 7>().tasks(
o(44) // expect: cb(2, 44, 7)
.when((s, a, c) => s + a.prop + c)
.map((s, a, c) => s + a.prop + c),
o(78) // expect: cb(2, 78, 7)
.when((s, a, c) => s + a.prop + c)
.map((s, a, c) => s + a.prop + c),
// etc...
// callback provided to `.map` is typesafe,
// callback provided to `.when` is not,
);
S and C
for the when(cb)
">
Как видите, обратный вызов, предоставленный when
, не является безопасным : Параметры S
и C
потеряны .