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

Redux saga use Call effect with generic function type typescript

我目前正在使用 Redux-saga 和打字稿。但是我不知道如何在 Typescript 中使用 call 效果和 generic function type

例如。我有一个像这样的通用类型的函数:

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

而且,在 saga 中,我希望代码是这样的:

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

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

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

但这不是我的期望。我怎么知道有没有 way/syntax 满足我上面的期望?

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

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

并为 call 函数提供类型

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

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

您可以使用 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)。

不确定为什么这不是官方打字。

你可以尝试 saga return 输入 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');
...
}