ts中Promise返回值二选一
async function test<T extends unknown>(promise: Promise<T>): Promise<[any, null] | [null, T]> {
try {
const data = await promise
return Promise.resolve([null, data])
} catch (err) {
return Promise.resolve([err, null])
}
}
async function main() {
const [err, res] = await test<number>(new Promise(() => 123))
if (err) return
console.log(res) //推导的类型为:const res: number | null
// 我希望的是,如果err存在,res为null
//如果err不存在,res为T
}
【以下回答由 GPT 生成】
这个问题可以通过类型断言来解决。在main
函数中,我们可以手动指定res
的类型为T
,当err
不存在时。
以下是修改后的代码:
async function test<T extends unknown>(promise: Promise<T>): Promise<[any, null] | [null, T]> {
try {
const data = await promise
return Promise.resolve([null, data])
} catch (err) {
return Promise.resolve([err, null])
}
}
async function main() {
const [err, res] = await test<number>(new Promise(() => 123))
if (err) return
console.log(res as number) // 类型断言为 number 类型
}
在console.log
语句中,我们使用了类型断言as number
来指定res
的类型为number
。这样可以让TypeScript正确推断出res
的类型。
这就是如何修改代码来实现你期望的功能。
【相关推荐】