如何修复“TS2769:没有与此调用匹配的过载”

B--*_*ian 15 javascript typescript reactjs webpack

包更新后,我突然收到奇怪的打字稿错误:

[tsl] C:..\UI\src\sagas.ts(40,21) TS2769 中的错误:没有与此调用匹配的重载。

最后一次重载给出了以下错误。“LOAD_IDS”类型的参数不可分配给“TakeableChannel”类型的参数。

对应的第 39-41 行sagas.ts

function* watchIds() {
    yield takeEvery(Actions.LOAD_IDS, loadIds);
}
Run Code Online (Sandbox Code Playgroud)

该函数function* loadIds({ forceReload })的定义sagas.ts与 API 调用相同。

TS 错误是什么意思,我该如何解决?

  1. 我的packages.json样子:https : //pastebin.com/raw/nJ0cPNXb

  2. 也许也很重要:我的webpack.config.jshttps://pastebin.com/raw/JNdXTCMb

参考

小智 5

我也遇到过这个问题,但是问了同事,了解到以下解决方法:

redux-saga 需要TakeableChannel<unknown>. 这是一个动作,所以你声明 loadIds 的参数类型是这样的动作形状:

function* loadIds({
   forceReload
}: { 
   type: string;
   forceReload: any; // your forceReload type
}) {
   // your code
}
Run Code Online (Sandbox Code Playgroud)


B--*_*ian 3

我的同事最终教了我一个解决方法:

  1. 排除相应的操作,例如takeEvery从原始import语句中排除。
  2. 导入所有带有as EffwhereEff是别名的操作。
  3. 定义一个与原始操作同名的新常量。
import { put, fork, select, call } from 'redux-saga/effects' // <-- modified
import * as Eff from 'redux-saga/effects'  // <-- new

// ... 

const takeEvery: any = Eff.takeEvery;      // <-- new
const takeLatest: any = Eff.takeLatest;    // <-- new
Run Code Online (Sandbox Code Playgroud)

据我了解,他的想法是明确允许any 类型。

编辑:我知道 Facebook(作为 React 的开发者)明确指出不应使用继承,请参阅https://reactjs.org/docs/composition-vs-inheritance.html