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

Posted

技术标签:

【中文标题】如何修复“TS2769:没有超载匹配此调用”【英文标题】:How to repair a 'TS2769: No overload matches this call' 【发布时间】:2020-02-18 12:22:56 【问题描述】:

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

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

最后一次重载出现以下错误。 '"LOAD_IDS"' 类型的参数不能分配给 'TakeableChannel' 类型的参数。

sagas.ts对应的39-41行是

function* watchIds() 
    yield takeEvery(Actions.LOAD_IDS, loadIds);

函数function* loadIds( forceReload ) 定义在同一个sagas.ts 中,只是API 调用。

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

    我的packages.json 看起来像这样:https://pastebin.com/raw/nJ0cPNXb

    也许也很重要:我的webpack.config.js 是https://pastebin.com/raw/JNdXTCMb

参考文献

No overload matches this call. Type 'string' is not assignable to type 'Signals' https://engineering.datorama.com/demystifying-function-overloading-in-typescript-eb9f8ca6b87d

【问题讨论】:

【参考方案1】:

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

    排除相应的操作,例如takeEvery 来自原始 import 声明。 使用as Eff 导入所有操作,其中Eff 是别名。 定义一个与原始操作同名的新常量。
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

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

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

【讨论】:

【参考方案2】:

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

redux-saga 采用 TakeableChannel&lt;unknown&gt;。这是一个动作,所以你声明 loadIds 的参数类型是这样的动作形状:

function* loadIds(
   forceReload
:  
   type: string;
   forceReload: any; // your forceReload type
) 
   // your code

【讨论】:

以上是关于如何修复“TS2769:没有超载匹配此调用”的主要内容,如果未能解决你的问题,请参考以下文章

如何修复drv?

如何修复 npm 审计修复问题?

如何修复WMI

如何修复AppScan漏洞

如何在DOS环境下修复系统

如何修复这些漏洞? (npm audit fix 无法修复这些漏洞)