打字稿:取决于参数的函数类型

时间:2020-10-29 08:52:23

标签: typescript

我正在尝试构建一个apiService,该APIService提供的返回方法和参数类型取决于指定的路由。我的方法如下:

enum Routes {
    task = "task",
    category = "category"
}

type GetReturnTypes = {
    task: Task[],
    category: Category[]
}

type PostPayloadTypes = {
    task: TaskPrototype,
    category: CategoryPrototype
}

type PostReturnTypes = {
    task: Task,
    category: Category
}

type ApiServiceType = {
    get<P extends Routes>(route: P , id?:number):Promise<P extends Routes ? GetReturnTypes[P] : never>
    post<P extends Routes>(route: P, params: PostPayloadTypes[P]):Promise<PostReturnTypes[P]>
}

export const apiService:ApiServiceType = {
    get: (route, id) => {
        switch (route){
            case Routes.task:
                return /* returns Task */
            case Routes.category:
                return /* return Category */
            default :
                throw new Error("invalid Route!")
        };
    }
    //...
}

当我使用apiService时,我得到的正是预期的自动完成功能。但是对于get方法,我得到了以下编译器错误:

键入'(route:P,id:number | undefined)=> Promise <任务[]> |不能将Promise '分配为类型'(route:P,id ?: number | undefined)=> Promise '。 键入'Promise <任务[]> |不能将Promise '分配给类型'Promise '。 类型“ Promise <任务[]>”不可分配给类型“ Promise ”。 类型“ Task []”不可分配给类型“ GetReturnTypes [P]”。 无法将类型“任务[]”分配给类型“任务[]和类别[]”。 类型“ Task []”不可分配给类型“ Category []”。 “任务”类型缺少属性“颜色”,但在“类别”类型中为必需

我希望switch表达式允许打字稿将预期的大小写匹配到Types,但是不知何故。有人知道如何解决这个问题吗?

非常感谢:)!

0 个答案:

没有答案