在 Typescript 中解构函数参数

Gre*_*rel 11 types typescript

我正在尝试为以下函数的成员提供类型。 args是具有data类型属性的对象UserCreateInput

所以,从这个:

createUser(parent: any, args: any, context: any) {
    return context.prisma.createUser(args.data)
}
Run Code Online (Sandbox Code Playgroud)

我是这样写的:

createUser(parent: any, args: {data: UserCreateInput}, context: any) {
    return context.prisma.createUser(args.data)
}
Run Code Online (Sandbox Code Playgroud)

我不确定如何替换“xxx”,createUser(parent: any, xxx, context: any)所以我可以简单地返回return context.prisma.createUser(data)

Tit*_*mir 24

您可以使用对象解构语法:

createUser(parent: any, { data }: { data: UserCreateInput }, context: any) {
    return context.prisma.createUser(data)
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,它需要你写data两次。有一个建议可以解决这个问题,但存在一些问题。

  • 我觉得这太可怕了。我在 Javascript 中一直使用参数解构,现在一切都必须重复,每个人都认为这很正常?我见过的任何语言都没有这样做!说真的,看看那东西变得多么丑陋! (13认同)
  • 把我算在“不可接受”的阵营里吧。看起来正在开发中,但需要很长时间 - https://github.com/Microsoft/TypeScript/issues/29526 (6认同)

use*_*ca8 5

内联对象类型的一种广泛使用且可以说不太难看的替代方案是将解构对象定义为命名的 args 或 props 类型。例如:

interface CreateUserArgs {
  data: UserCreateInput
}

createUser(parent: any, { data }: CreateUserArgs, context: any) {
    return context.prisma.createUser(data)
}
Run Code Online (Sandbox Code Playgroud)

遗憾的是,它仍然需要复制属性名称(并且意味着您需要为其命名),但它有两个潜在的好处:

  • 它不会用括号填充参数列表,因此更容易查看顶级参数是什么以及有多少个
  • 该类型可以导出并在其他文件中使用(例如,如果在调用函数时构建 args 对象不仅仅是内联,则由该函数的使用者使用)