TypeScript:输入具有不同返回类型的 httprequest

标签 typescript http es6-promise

我相当熟悉 Javascript,但在重新创建我在 TypeScript 中使用的一些模式时遇到了一些问题,因为我不确定如何键入可能具有不同 JSON 字段的函数。例如,我试图编写一个我可以使用的简单的 http 请求函数:

async function requestTest (options: https.RequestOptions) {
    const prom = new Promise((resolve, reject) => {
        https.request(options, (res) => {
            res.on('data', (d) => {
                if (d.status == 200) {
                    resolve(d)
                }
                reject('failed')
            })
        })
    return await prom

但是,如果我真的想使用这个函数,比如查询一个数据库并返回一个结果,其中响应中的“数据”字段将包含已知结构的数据,我有一个声明接口(interface):

const getData = (opts): ISomeStructure => {
    return requestTest(opts)
}

我得到一个错误类型:

Type 'Promise<{}>' is not assignable to type 'ISomeStructure'.

如何以告诉 typescript 的方式声明类型,在这种情况下,我希望 http 响应具有包含 ISomeStructure 的键JSON 对象?

最佳答案

您的代码有两个问题,一个与异步代码有关,另一个与类型有关。

异步问题是您返回 requestTest(opts)当您声明您的函数将返回 ISomeStructure 时.自 requestTest返回 Promise你应该返回 Promis<ISomeStructure>来自 getData , 因为 requestTest 返回的数据不会立即可用直接返回。

第二个问题是您应该允许将请求的返回类型指定为requestTest 上的类型参数。这样你的函数就可以用于任何返回类型。

function requestTest<T>(options: https.RequestOptions) {
    return new Promise<T>((resolve, reject) => {
        https.request(options, (res) => {
            res.on('data', (d) => {
                if (d.status == 200) {
                    resolve(d)
                }
                reject('failed')
            })
        })
    });
}

const getData = (opts: https.RequestOptions): Promise<ISomeStructure> => {
    return requestTest<ISomeStructure>(opts)
}

关于TypeScript:输入具有不同返回类型的 httprequest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53322366/

相关文章:

javascript - 当错误可能未包含在 promise 中时,我如何使用 promise 来捕获错误?

javascript - Promise 不解析 node.js

javascript - 基于一个公共(public)键angular 2合并2个数组

带有子路径和导航栏的 Angular 模块

HTTP Response Header 标识响应请求的实际服务器

java - 如何在服务器端将 HTTP POST 请求正文作为 Java 字符串获取?

validation - 如何在 PHP 中解析/验证/处理 http header

javascript - NodeJS/Javascript - 使用 Promise 处理图像收集然后保存聚合结果

node.js - 如何在浏览器中使用 typescript ?

javascript - const 声明需要一个初始化值