我目前正在使用Redux-saga和打字稿。但是我不知道如何在Typescript中将call
与generic function type
一起使用。
例如我有一个具有通用类型的函数,如下所示:
function identity<T>(arg: T): T {
return arg;
}
而且,在传奇中,我希望这样的代码:
...
const result = yield call(identity<string>, "myString")
...
但是,编译器显示错误。当然,我可以写
const result = yield call(identity, "myString")
但这不是我的期望。我怎么知道有什么方法/语法可以满足我的上述期望?
答案 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');
...
}