如何让自定义Promise函数返回JSON对象时支持自动提示(类似Axios)
让自定义Promise实现返回值自动提示的方法
嘿,这个需求很常见!要让你的自定义Promise在.then()回调里自动提示返回对象的属性,关键是让TypeScript(或者支持类型推断的编辑器)明确知道Promise最终resolve的值是什么类型——就像Axios的类型定义已经帮我们做好了这件事一样。
下面分两种场景给你解决方案:
1. TypeScript 环境下的实现
方法一:直接给Promise指定泛型类型
你可以在创建Promise实例时,通过泛型明确声明resolve的对象结构:
const test = () => { // 这里<{ object: string }>告诉TS,这个Promise会resolve一个包含object字符串属性的对象 return new Promise<{ object: string }>((resolve, reject) => { resolve({ object: "Hello There" }); }); }; // 调用时,res会自动提示object属性 test().then((res) => { console.log(res.object); // 编辑器会自动补全object });
方法二:用接口/类型别名复用类型(推荐复杂结构)
如果你的返回对象结构比较复杂,或者需要多处复用,建议先定义接口或类型别名:
// 定义返回值的类型结构 interface TestResponse { object: string; // 可以添加更多属性,比如其他字段 // id: number; } const test = (): Promise<TestResponse> => { return new Promise((resolve, reject) => { resolve({ object: "Hello There" }); }); }; // 此时res会自动提示TestResponse里的所有属性 test().then((res) => { console.log(res.object); });
2. JavaScript 环境下的实现
如果你用的是纯JS,也可以通过JSDoc注释让编辑器(比如VS Code)识别类型,实现自动提示:
/** * 自定义Promise函数 * @returns {Promise<{ object: string }>} 返回包含object属性的Promise */ const test = () => { return new Promise((resolve, reject) => { resolve({ object: "Hello There" }); }); }; // 调用时,VS Code会根据JSDoc提示res的object属性 test().then((res) => { console.log(res.object); });
原理说明
Axios之所以能自动提示res.data的属性,是因为它的官方类型定义中,已经为请求方法(比如axios.get)指定了泛型的响应结构,让TS能准确推断出返回值的类型。我们自定义Promise时,只需要手动补上这个类型信息,就能让编辑器实现同样的自动提示效果啦。
内容的提问来源于stack exchange,提问作者jaffer_syed
相关产品推荐
相关产品推荐

