如何删除一些用于将数据发送到 graphql 的属性

Posted

技术标签:

【中文标题】如何删除一些用于将数据发送到 graphql 的属性【英文标题】:How to remove some properties for sending data to graphql 【发布时间】:2019-10-08 09:42:39 【问题描述】:

我有一个 graphql 端点,我从服务器提供一个对象,如下所示 parentId : 42, parrent:

对于我的更新,我只接受这个 parentId : 42

如何去除额外的父属性,使其不被发送到服务器进行突变?

我正在使用一组生成的类,它们如下是一个更复杂的示例。

因此,手动映射每个属性都有效,但维护起来很麻烦。

export type Folder = 
  id: Scalars["String"];
  name?: Maybe<Scalars["String"]>;
  parrentFolder?: Maybe<Folder>;
  parrentFolderId?: Maybe<Scalars["String"]>;
;

export type FolderInput = 
  name: Scalars["String"];
  parrentFolderId?: Maybe<Scalars["String"]>;
  id?: Maybe<Scalars["String"]>;
;

不删除 parrentFolder 会产生以下错误:Unrecognized input fields 'parrentFolder'

我希望有一种从文件夹到文件夹输入的方法,该方法对任一对象的更改都具有弹性。缺少属性的错误(出现在 FolderInput 上而不是 Folder 上)很简洁,但不是必需的

【问题讨论】:

我最好的选择似乎是***.com/questions/42631523/…,但我希望避免写所有这些。 【参考方案1】:

您可以简单地使用delete 运算符在类型转换后删除不需要的parrentFolder 属性。请记住,typescript 编译成 javascript 后类型会消失,因此类型定义在运行时不可用,这使得自动映射难以完成。

打字稿中的示例(我简化了您的类型):

export type Folder = 
  id: string;
  name?: string;
  parrentFolder?: any;
  parrentFolderId?: string;
;

export type FolderInput = 
  name: string;
  parrentFolderId?: string;
  id?: string;
;

const folder: Folder = 
  id: 'xxx',
  name: 'yyy',
  parrentFolder: ,
  parrentFolderId: 'zzz'


const folderInput = folder as FolderInput;
console.log(folderInput);

delete folderInput['parrentFolder'];
console.log(folderInput);

编译后:

"use strict";
exports.__esModule = true;
var folder = 
    id: 'xxx',
    name: 'yyy',
    parrentFolder: ,
    parrentFolderId: 'zzz'
;
var folderInput = folder;
console.log(folderInput);
delete folderInput['parrentFolder'];
console.log(folderInput);

这是输出:

 id: 'xxx',
  name: 'yyy',
  parrentFolder: ,
  parrentFolderId: 'zzz' 

 id: 'xxx', name: 'yyy', parrentFolderId: 'zzz' 

如果您想继续使用原始文件夹对象,您可能需要添加深层克隆。

【讨论】:

我希望删除 parrentFolder 槽反射,也就是发现 parrentFolder 是一个不匹配的属性并将其清除。这样做的原因是长期维护,如果将属性添加到不在 FolderInput 上的文件夹怎么办。 您将很难做到这一点,因为您无法在运行时访问类型信息。可能有一个简单的方法,但我不知道。

以上是关于如何删除一些用于将数据发送到 graphql 的属性的主要内容,如果未能解决你的问题,请参考以下文章

如何将一个模板的一些数据发送到另一个模板 Meteor

如何将 GraphQL 查询从 Node.js 发送到 Prisma

以LeetCode为例——如何发送GraphQL Query获取数据

如何在 Gatsby 中根据其他字段删除 GraphQL 字段?

Graphql 架构

无法将 GraphQL 查询从 Apollo 客户端发送到 Rails GraphQL 后端