typescript中Promise<T>再封装Promise<IResponse<T>>,原理是什么?

看到大牛的代码Promise<IResponse<T>>,不太明白。
Promise<T> 是 ES2015 自带类型,在 TS 标准库中就有。
参见:https://segmentfault.com/q/10...

如果要支持这种类型Promise<IResponse<T>>
还需要写哪些代码?

个人观点:Promise<IResponse<T>> 是Promise<T>的一种,其中前面的IResponse<T>相当于后面的T,也就是需要实现IResponse<T>。

阅读 4.4k
2 个回答

你看到的代码大概应该是这样的:

type IResponse<T> = {
    data: T
    code: string
}

function query<T>(param: string): Promise<IResponse<T>> {
    return new Promise((resolve) => {}) // 省略部分代码
}

query<{ age: number }>('tom').then((res) => {
    if (res.code === '00000') {
        console.log(res.data.age) // number
    }
})

你的个人观点没啥问题,就是个封装而已。

有点似是而非的感觉,这个事情其实和Promise<T>没什么关系,就是最简单的泛型定义,比如Array<T>。

// 不使用泛型的声明
type A = {name: string; contact: number;}
type B = {name: string; contact: string;}
const a: A = {name: 'A', contact: 138};
const b: B = {name: 'B', contact: 't@a.b'};
// 使用泛型
type A<T> = {name: string; contact: T}
const a: A<string> = {name: 'A', contact: 't@a.b'};

对于你的例子其实很常见,由于后端是统一输出的,所以

type IResponse<T> = {
    code: string; // 错误码
    success: boolean;
    message?: string;
    data: T; // data的类型是根据请求的API决定的
}
// 当你定义数据请求接口时就可以
function getUser(id: string): Promise<IResponse<User>>
function getUserList(): Promise<IResponse<Array<Client>>>

我实际项目中定义了ResponseObject<T>和ResponseList<T>,两者的区别就是data: Tdata: Array<T>,目的就是懒得写成ResponseObject<Array<T>>

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Microsoft
子站问答
访问
宣传栏