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');
...
}
我目前正在使用 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');
...
}