Redux saga使用通用函数类型typescript的调用效果

Redux saga使用通用函数类型typescript的调用效果,typescript,redux-saga,Typescript,Redux Saga,我目前正在使用Redux saga和typescript。但是我不知道如何在Typescript中使用calleffect和generic function type 例如,我有一个泛型函数,如下所示: function identity<T>(arg: T): T { return arg; } 但这不是我的期望。我怎么知道有什么方法/语法可以满足我的上述期望 可能的解决方案是定义标识函数的类型,并使用它专门化调用调用 type identityFunction<T

我目前正在使用Redux saga和typescript。但是我不知道如何在Typescript中使用
call
effect和
generic function type

例如,我有一个泛型函数,如下所示:

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

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

可能的解决方案是定义
标识
函数的类型,并使用它专门化
调用
调用

type identityFunction<T> = (agr: T) => T;
现在,如果您尝试使用错误的参数调用
yield call
(也如果identity函数的签名与type
identityFunction
不匹配),TypeScript将显示错误。

您可以使用向
的“redux saga/effects”添加额外的键入
模块,类似于
功能。应用
键入:

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>;
}
从'redux saga/effects'导入{CallEffect};
声明模块“重演传奇/效果”{
导出函数调用(fn:(…args:A)=>R,…args:A):CallEffect;
}
确保这是一个类型脚本文件(
*.ts
),而不是一个声明文件(
*.d.ts


不知道为什么这不是正式的输入。

const result=yield call(identity,“myString”)
为什么这不适合您?这就是我要做的,除了我还要给result一个显式类型,如
const result:string=/*etc*/
@NicholasTower在我的示例中,我只返回带参数的相同类型,所以按你的方式做是好的,但在某些情况下,它返回另一个类型而不是T。我想要的是确保函数在
调用中使用时收到显式定义的类型。最佳答案,但为什么在*.ts文件中声明它有效而不是*.d.ts文件?这是一个我没有答案的大问题。在TS的官方模块扩充文档中,他们将其放入
.TS
文件中。我认为,否则它会覆盖整个模块的类型,不仅仅是您更改/添加的类型,但我不确定。最近我一直在使用vue3,它们的类型垫片与此类似,但它们可以放在
.d.ts
文件中
type identityFunction<T> = (agr: T) => T;
yield call<identityFunction<string>>(identity, 'myString');
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>;
}