在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
不满足此要求。>
答案 0 :(得分:0)
最常见的Function
是您可以输入函数的。太宽泛了,无法用于需要更具体的功能(从(result: any) => void
到any
的{{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;
}