TypeScript Fetch 响应的 response.Json<T> - 预期为 0 个类型参数,但实际得到了 1 个。

18

请原谅我的无知,我正在尝试在TypeScript中实现fetch,我一直在查找示例但是无法编译。我对TypeScript和Promise都很陌生,我找到了这个例子:

如何在typescript中使用fetch

我正在尝试实现它:

private api<T>(url: string): Promise<T> {
        return fetch(url)
          .then(response => {
            if (!response.ok) {
              throw new Error(response.statusText)
            }
            return response.json<T>()
          })          
}

然而编译器显示错误:

[ts] 预期0个类型参数,但得到了1个。

我不确定问题出在哪里,但基本上我正在尝试实现一个类来封装API调用以返回项目数组,并且我已经尝试使用async/await,但好像都不太适用。任何帮助都将不胜感激。


response.json() 不是一个通用方法,但你试图将其变成通用的。 - Niladri
2
也许你正在寻找像这样将其转换为特定类型的 Promise 的东西,例如 return response.json() as Treturn <T>response.json() - Niladri
3个回答

15

看起来签名不在那里了,相反请使用此代码:

response.json().then(data => data as T);

是的,这将返回一个强类型数据。以下是完整的代码片段。

private api<T>(url: string): Promise<T> {
    return fetch(url)
      .then(response => {
        if (!response.ok) {
          throw new Error(response.statusText)
        }
        return response.json().then(data => data as T);
      })          
}

5

当我忘记了这个导入语句时,在使用Express时遇到了相同的错误:

import { Request, Response } from 'express';

完整的例子如下:
// controllers/my-controller.ts
import { Request, Response } from 'express';

export const someMethod = async (req: Request, res: Response) => {
   // ...
}

0

我发现上面的答案有一个问题。 如果你有这样的JSON主体

{ "error" : "{ "message" : "some message" }" }

上面的代码将返回一个带有一个键错误和"{ "message" : "some message" }"的对象。所以最好使用


JSON.Stringify(data)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接