我对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对象的密钥?
答案 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)
}