2017-01-16 2 views
9

Как пользователь TypeScript и redux-thunk, мне интересно узнать о преимуществах, предлагаемых компанией redux-saga. Я хотел бы сделать снимок, но меня беспокоит функция call и очевидная потеря безопасности типа.Redux Sagas, TypeScript и вызов?

Если я это сделать:

function* invalidateReddit(): SagaIterator { 
    while (true) { 
    const {reddit} = yield take(actions.INVALIDATE_REDDIT) 
    yield call(fetchPosts, reddit) 
    } 

компилятор не сможет проверить вызовы fetchPosts. Так что, если я изменил подпись не включать аргумент ...

function fetchPosts() { 
    // anything here... 
} 

invalidateReddit функция, которая зависит от fetchPosts, должен не компилировать, но это не потому, что call оценивает мой код для меня. Существует ли установленная схема для использования этого без ущерба для безопасности типа?

ОБНОВЛЕНИЕ: PR в https://github.com/redux-saga/redux-saga/pull/740 выглядит как попытка решить эту проблему. Я оставлю это открытым до тех пор, пока оно не будет закрыто решением.

+0

Кажется, что PR, упомянутый в UPDATE, не работает. Я пробовал последний код в ветке, и это «любой» тип. Вероятно, это проблема с самим TypeScript, но не похоже, что они работают над включением пользовательских типов в операторы 'yield'. – Jurosh

ответ

1

Поскольку TypeScript не будет жаловаться на избыточные переменные, которые вы передали функции.

Как тип декларации само по себе, https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/redux-saga/index.d.ts#L75

export function call<T1, T2, T3>(fn: EffectFunction<T1, T2, T3>, arg1?: T1, arg2?: T2, arg3?: T3, ...rest: any[]): Effect; 

Если передать функцию с арностью менее 3 до call, все параметры типа будет выведено на {}, верхний тип TS. Таким образом, каждая вещь будет назначаться при таком вызове call(zeroArityFunc, anything).

Во время выполнения избыточный аргумент не вызывает ошибки, поэтому ваш код должен быть в порядке. Если fetchPosts действительно требует аргумента, то параметр типа для него будет выведен, и ошибка компилятора будет поднята.

+0

Я не уверен, что понимаю. Я не могу инициировать ошибку компилятора для любого кода, который использует 'call' в данный момент, независимо от arity. Я просто заметил открытый PR, https://github.com/redux-saga/redux-saga/pull/740, который может быть предназначен для решения проблемы, которую я описываю. – subvertallchris

+1

Не могли бы вы поделиться своим кодом? –

Смежные вопросы