错误TS2345:类型的参数&#39;(响应:字符串)=&gt;空隙&#39;不能指定类型&#39;((值:{})=&gt; void | PromiseLike <void>)的参数空值

时间:2018-05-18 18:00:12

标签: typescript

我通过npm更新了我的打字稿包,现在我收到了错误:

&#34; TS2345:类型的参数&#39;(响应:字符串)=&gt;空隙&#39;不能指定类型&#39;((值:{})=&gt; void | PromiseLike)的参数null |未定义&#39;&#34;

尝试编译以下代码时:

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行

我已经阅读了其他类似的问题,但我无法理解我的问题。

1 个答案:

答案 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?请注意,urlPathparams都不依赖于T。这意味着编译器几乎没有办法推断T的任何值。它看起来像是默认为空对象类型{},当TypeScript无法推断出类型参数的任何值时,它往往会发生。键入参数推断(参见the Handbook section on generics并查找&#34;键入参数推断&#34;以获取更多信息)不会发生。

通过调用

显式指定类型参数
this._send<string>('time')

这应该允许您的then调用成功编译。请注意,通过将类型参数T显式设置为string,您相信异步调用将在运行时实际返回string_send()的签名似乎确保它会为调用者指定的Promise<T>值返回T,但显然它不能真正做到运行。所以要小心。

希望有所帮助。祝你好运!