如何删除一些用于将数据发送到 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 的属性的主要内容,如果未能解决你的问题,请参考以下文章
如何将 GraphQL 查询从 Node.js 发送到 Prisma
以LeetCode为例——如何发送GraphQL Query获取数据