如何删除一些用于将数据发送到 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 的属性的主要内容,如果未能解决你的问题,请参考以下文章