我相当熟悉 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/