TypeScript:键入具有多种返回类型的httprequest

时间:2018-11-15 15:07:16

标签: typescript http es6-promise

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

<f:cObject typoscriptObjectPath="lib.dynamicContent" data="{pageUid: '84', colPos: '0'}" />

但是,如果我实际上要使用此功能,则说查询数据库并返回结果,其中响应上的“数据”字段将包含具有为之声明的接口的已知结构的数据:

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

我收到以下类型的错误:

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

如何以一种告诉打字稿的方式声明类型,在这种情况下,我期望http响应具有一个包含Type 'Promise<{}>' is not assignable to type 'ISomeStructure'. JSON对象的密钥?

1 个答案:

答案 0 :(得分:1)

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

异步问题是您在声明函数将返回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)
}