【问题标题】:Wrong type interface implementation错误的类型接口实现
【发布时间】:2019-11-19 14:40:12
【问题描述】:

我正在尝试按照 Prisma's 指南设置 GraphQL Go 服务器。

Resolver.go

package main

import (
    "context"
    "prismago/hello-world/generated/prisma-client"
)

// Resolver struct
type Resolver struct {
    Prisma *prisma.Client
}

// Mutation MutationResolver
func (r *Resolver) Mutation() MutationResolver {
    return &mutationResolver{r}
}

// Post PostResolver
func (r *Resolver) Post() PostResolver {
    return &postResolver{r}
}

// Query QueryResolver
func (r *Resolver) Query() QueryResolver {
    return &queryResolver{r}
}

// User UserResolver
func (r *Resolver) User() UserResolver {
    return &userResolver{r}
}

type mutationResolver struct{ *Resolver }

func (r *mutationResolver) CreateUser(ctx context.Context, name string) (*prisma.User, error) {
    return r.Prisma.CreateUser(prisma.UserCreateInput{
        Name: name,
    }).Exec(ctx)
}
func (r *mutationResolver) CreateDraft(ctx context.Context, title string, userID string) (*prisma.Post, error) {
    return r.Prisma.CreatePost(prisma.PostCreateInput{
        Title: title,
        Author: &prisma.UserCreateOneWithoutPostsInput{
            Connect: &prisma.UserWhereUniqueInput{ID: &userID},
        },
    }).Exec(ctx)
}
func (r *mutationResolver) Publish(ctx context.Context, postID string) (*prisma.Post, error) {
    published := true
    return r.Prisma.UpdatePost(prisma.PostUpdateParams{
        Where: prisma.PostWhereUniqueInput{ID: &postID},
        Data:  prisma.PostUpdateInput{Published: &published},
    }).Exec(ctx)
}

type postResolver struct{ *Resolver }

func (r *postResolver) Author(ctx context.Context, obj *prisma.Post) (*prisma.User, error) {
    return r.Prisma.Post(prisma.PostWhereUniqueInput{ID: &obj.ID}).Author().Exec(ctx)
}

type queryResolver struct{ *Resolver }

func (r *queryResolver) PublishedPosts(ctx context.Context) ([]prisma.Post, error) {
    published := true
    return r.Prisma.Posts(&prisma.PostsParams{
        Where: &prisma.PostWhereInput{Published: &published},
    }).Exec(ctx)
}
func (r *queryResolver) Post(ctx context.Context, postID string) (*prisma.Post, error) {
    return r.Prisma.Post(prisma.PostWhereUniqueInput{ID: &postID}).Exec(ctx)
}
func (r *queryResolver) PostsByUser(ctx context.Context, userID string) ([]prisma.Post, error) {
    return r.Prisma.Posts(&prisma.PostsParams{
        Where: &prisma.PostWhereInput{
            Author: &prisma.UserWhereInput{
                ID: &userID,
            }},
    }).Exec(ctx)
}
func (r *queryResolver) Users(ctx context.Context) ([]prisma.User, error) {
    return r.Prisma.Users(&prisma.UsersParams{
        Where: &prisma.UserWhereInput{},
    }).Exec(ctx)
}

type userResolver struct{ *Resolver }

func (r *userResolver) Posts(ctx context.Context, obj *prisma.User) ([]prisma.Post, error) {
    return r.Prisma.User(prisma.UserWhereUniqueInput{ID: &obj.ID}).Posts(nil).Exec(ctx)
}

运行go run ./server 会产生以下错误:

cannot use &userResolver literal (type *userResolver) as type UserResolver in return argument:
        *userResolver does not implement UserResolver (wrong type for Posts method)
                have Posts(context.Context, *"prismago/hello-world/generated/prisma-client".User) ([]"prismago/hello-world/generated/prisma-client".Post, error)
                want Posts(context.Context, *"prismago/hello-world/generated/prisma-client".User) ([]*"prismago/hello-world/generated/prisma-client".Post, error)

我尝试修复类型错误:

func (r *userResolver) Posts(ctx context.Context, obj *prisma.User) ([]*prisma.Post, error) {
    return r.Prisma.User(prisma.UserWhereUniqueInput{ID: &obj.ID}).Posts(nil).Exec(ctx)
}

错误:

cannot use []"prismago/hello-world/generated/prisma-client".Post as type []*"prismago/hello-world/generated/prisma-client".Post in return argument

我做错了什么?

相关问题:https://github.com/99designs/gqlgen/issues/714

【问题讨论】:

  • 这个错误基本上是说[]prisma.Post不是[]*prisma.Post,这当然是正确的,这两个确实是不同的类型,并且要满足接口你的方法必须匹配逐字我>。除了错误信息还有什么不清楚的地方吗?
  • 感谢您的回复。因为我没有围棋经验,所以我可能会在这里跳枪。我理解打字错误,但我似乎无法通过简单地添加“*”等天真的尝试来纠正它。
  • 这正是您修复它的方法,只需在需要的位置添加*,至少这就是您修复那个特定错误的方法。如果编译仍然失败,则意味着您遇到的不仅仅是那个问题。请使用固定代码和新的错误消息更新您的问题。
  • 显然r.Prisma.User(prisma.UserWhereUniqueInput{ID: &obj.ID}).Posts(nil).Exec(ctx) 返回[]Post 而不是[]*Post。如果这是生成的代码,那么也许您应该进一步查看文档(您可能可以做一些事情来使 Prisma 与自身“兼容”)。
  • @Carrein 错误表明,正如 minitauros 指出的那样,从 Exec 返回的类型是 []Post... 在这种情况下,而不是“在需要的地方添加 *”您可以“删除不应该出现的*”,即无需更改*userResolver 类型上Posts 方法的返回类型,而是可以更改@987654341 上Posts 方法的返回类型@接口从[]*Post[]Post

标签: go prisma


【解决方案1】:

修改generated.go 文件接口以接受[]prisma.Post 的返回而不是[]*prisma.Post

变化:

type UserResolver interface {
    Posts(ctx context.Context, obj *prisma.User) ([]*prisma.Post, error)
}

收件人:

type UserResolver interface {
    Posts(ctx context.Context, obj *prisma.User) ([]prisma.Post, error)
}

【讨论】:

  • 它说不要编辑,因为它是由 gqlgen 自动生成的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-29
  • 1970-01-01
  • 1970-01-01
  • 2017-08-09
  • 2013-09-24
  • 1970-01-01
相关资源
最近更新 更多