为什么在此功能代码中出现打字稿错误?

时间:2019-05-09 22:04:07

标签: typescript

在Visual Studio 2017中编译我的.NET Core MVC解决方案时,出现以下错误。我不确定此错误是否会影响任何内容或是否被正确报告。

错误: addminutes

代码:

TS2322 Build:Type 'Function' is not assignable to type '(result: any) => void'

与错误行: export function getCachedThenUpdate(url: string, params: Params, updateCallback?: (result: any) => void): JQueryXHR { if (!updateCallback && typeof params == "function") { updateCallback = params; params = undefined; } const x = getCached(url, params); const cached = x.cached; var request = x.request(); if (updateCallback) { if (cached) updateCallback(cached); request.done(function (result) { // Data has changed? if (cached !== result && JSON.stringify(cached) !== JSON.stringify(result)) updateCallback(result); }); } return request; }

参数定义: updateCallback = params;

我尝试了什么? 如果我将错误行更改为: type Params = { [key: string]: any };则没有Typescript错误,所以我猜想updateCallback = function (data) { };需要分配给具有一个参数且没有返回值的函数,并且类型updateCallback不满足此要求。

1 个答案:

答案 0 :(得分:0)

最常见的Function是您可以输入函数的。太宽泛了,无法用于需要更具体的功能(从(result: any) => voidany的{​​{1}}函数)的地方。这就是实际错误的意思,但是更有趣的答案是为什么您首先拥有它。

此处隐藏了带有函数签名的JavaScript约定。确实超载如下:

void

如果仅给出2个参数,则第二个可以是export function getCachedThenUpdate(url: string, updateCallback: (result: any) => void): JQueryXHR; export function getCachedThenUpdate(url: string, params: Params): JQueryXHR; export function getCachedThenUpdate(url: string, params: Params, updateCallback: (result: any) => void): JQueryXHR; updateCallback。如果给出3,则第二个是params,第三个是params

由于javascript不支持类型重载函数,因此必须手动处理。因此,我们定义的函数的类型满足所有3个签名。一个更合适的是:

updateCallback

然后提供确定我们实际调用哪个签名的逻辑。这就是export function getCachedThenUpdate(url: string, params?: Params, updateCallback?: (result: any) => void): JQueryXHR 的来源。

typeof params == "function"

由于这种情况,不值得尝试使用打字稿来“检查您的工作”。我们需要选择强制类型// If updateCallback is not defined we have one of the first 2 signatures. // If params is a function then it must be the 2nd signature. Update local vars to reflect that. if (!updateCallback && typeof params == "function") { updateCallback = params; // The 2nd parameter is actuall the callback params = undefined; // The params were not actually given. } 的“信任我,我知道我在做什么”。

as (a: any) => void

这就是全部。为了说明清楚,签名有些过分了

if (!updateCallback && typeof params == "function") {
    updateCallback = params as (a: any) => void;
    params = undefined;
}