TypeScript无法返回指定元组类型,求正确类型定义语法
修正TypeScript异步函数的元组返回类型
你现在的问题是TypeScript把函数返回的元组识别成了数组,导致解构后类型不符合预期。以下是修正后的代码:
export function to<T>(promise: Promise<T>): Promise<[Error | null, T | null]> { return promise .then(data => [null, data] as const) .catch(err => [err as Error, null] as const); }
关键修正点:
- 明确元组返回类型:把原来的
Promise<(T|null)[]|[Error, null]>改成Promise<[Error | null, T | null]>,直接指定这是固定顺序的二元组,而非数组或模糊的联合类型。 - 使用
as const断言:在then和catch的返回数组后加上as const,让TypeScript把数组认定为只读元组,避免被自动宽化为可扩展的数组类型,确保每个位置的类型严格对应。
测试修正后的用法:
const [err, result] = await to(api.changePassword(username, password)); // err 的类型:Error | null // result 的类型:api.changePassword返回的类型 | null
原来的写法之所以出问题,是因为联合数组类型(T|null)[]|[Error, null]会被TypeScript处理成“任意元素为T|null或Error|null的数组”,解构时自然无法区分两个位置的具体类型。换成明确的元组类型后,TypeScript就能准确推断每个解构变量的类型了。
内容的提问来源于stack exchange,提问作者Lovethenakedgun
相关产品推荐
相关产品推荐

