如何删除一些属性以将数据发送到graphql

时间:2019-05-22 00:02:30

标签: typescript graphql

我有一个graphql端点,我从服务器提供了一个这样的对象{parentId:42,父母:{}}

对于我的更新,我仅接受此{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会产生以下错误:无法识别的输入字段'parrentFolder'

我想要一种从Folder转到FolderInput的方法,该方法可以抵抗两个对象中的更改。缺少属性的错误(存在于FolderInput而不是Folder上)很简洁,但不是必需的

1 个答案:

答案 0 :(得分:0)

您可以简单地使用delete运算符在类型转换后删除不需要的parrentFolder属性。请记住,将类型脚本编译为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' }

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