我通过npm更新了我的打字稿包,现在我收到了错误:
" TS2345:类型的参数'(响应:字符串)=>空隙'不能指定类型'((值:{})=> void | PromiseLike)的参数null |未定义'"
尝试编译以下代码时:
private _send<T>(urlPath: string, params?: RequestParams): Promise<T> {
return this._requester.sendRequest<T>(this._datafeedURL, urlPath, params);
}
public getServerTime(callback: ServerTimeCallback): void {
this._send('time')
.then((response: string) => {
const time = parseInt(response);
if (!isNaN(time)) {
callback(time);
}
})
.catch((error?: string | Error) => {
logMessage(`Failed to load server time, error=${getErrorMessage(error)}`);
});
}
错误来自.then行
我已经阅读了其他类似的问题,但我无法理解我的问题。
答案 0 :(得分:3)
签名
_send<T>(urlPath: string, params?: RequestParams): Promise<T>;
返回一个Promise<T>
,它有一个then()
方法,其第一个参数是一个带有T
类型参数的回调。如果你不知道promises是什么,你应该阅读它们。五秒钟的解释是,Promise<Foo>
是一个对象,最终将在某个时间点保留Foo
个对象,并告诉它(使用then()
方法)它是什么当它最终得到它时,应该使用那个Foo
对象。
由于您使用其参数为then()
的回调函数调用string
,因此您需要将T
分配给string
。最简单的方法是T
string
。
那么您与_send()
有什么关系让T
等于string
?请注意,urlPath
和params
都不依赖于T
。这意味着编译器几乎没有办法推断T
的任何值。它看起来像是默认为空对象类型{}
,当TypeScript无法推断出类型参数的任何值时,它往往会发生。键入参数推断(参见the Handbook section on generics并查找&#34;键入参数推断&#34;以获取更多信息)不会发生。
通过调用
显式指定类型参数this._send<string>('time')
这应该允许您的then
调用成功编译。请注意,通过将类型参数T
显式设置为string
,您相信异步调用将在运行时实际返回string
。 _send()
的签名似乎确保它会为调用者指定的Promise<T>
的值返回T
,但显然它不能真正做到运行。所以要小心。
希望有所帮助。祝你好运!