Redux传奇使用带有通用函数类型打字稿的Call效果

时间:2019-10-20 07:23:17

标签: typescript redux-saga

我目前正在使用Redux-saga和打字稿。但是我不知道如何在Typescript中将callgeneric function type一起使用。

例如我有一个具有通用类型的函数,如下所示:

function identity<T>(arg: T): T {
    return arg;
}

而且,在传奇中,我希望这样的代码:

...
const result = yield call(identity<string>, "myString")
...

但是,编译器显示错误。当然,我可以写

const result = yield call(identity, "myString")

但这不是我的期望。我怎么知道有什么方法/语法可以满足我的上述期望?

3 个答案:

答案 0 :(得分:1)

您可以使用module augmentation"redux-saga/effects"模块添加类似于Function.apply键入的其他键入:

import { CallEffect } from 'redux-saga/effects';

declare module 'redux-saga/effects' {
  export function call<A extends any[], R>(fn: (...args: A) => R, ...args: A): CallEffect<R>;
}

确保该文件位于打字稿文件(*.ts)中,而不是在声明文件(*.d.ts)中。

不知道为什么这不是官方输入。

答案 1 :(得分:0)

可能的解决方案是定义identity函数的类型,并使用它来专门化call调用。

type identityFunction<T> = (agr: T) => T;

并向call函数提供类型

yield call<identityFunction<string>>(identity, 'myString');

现在,如果您尝试使用错误的参数调用yield call<identityFunction<string>>(同样,如果身份函数的签名与类型identityFunction<T>不匹配),TypeScript将显示错误。

答案 2 :(得分:0)

你可以试试 saga 返回类型 SagaIterator

import { SagaIterator } from '@redux-saga/core';
import { put, select, call } from 'redux-saga/effects';
function identity<T>(arg: T): SagaIterator  {
...
  yield call([identityFunction<string>>],identity, 'myString');
...
}