过滤掉打字稿中接口的不需要的对象属性

Posted

技术标签:

【中文标题】过滤掉打字稿中接口的不需要的对象属性【英文标题】:filter out unneeded object properties for interface in typescript 【发布时间】:2019-02-10 21:24:32 【问题描述】:

作为背景,我使用的是 Prisma (graphql)、mysql2 (nodejs) 和 typescript。

我正在使用交互式命令行脚本连接到 mysql2。

这是我看到的警告:

忽略传递给 Connection: 类型的无效配置选项。这 当前是警告,但是在MySQL2的未来版本中,出现错误 如果您将无效的配置选项传递给 连接

这就是我在 MysqlConnector 类中实例化 mysql2 的方式:

this.connectionPromise = await this.mysql.createConnection(this.connectionOptions)

“connectionOptions”在类构造函数中设置:

constructor(connectionDetails: MysqlConnectionDetails) 

这是我的类型定义:

export interface MysqlConnectionDetails 
  host: string
  port: number
  user: string
  password: string
  database?: string

这是我传入 MysqlConnector 类的对象的类型定义:

export interface DatabaseCredentials 
  type: DatabaseType
  host: string
  port: number
  user: string
  password: string
  database?: string
  alreadyData?: boolean
  schema?: string
  ssl?: boolean
  filter?: any

所以,我传入了一个对象,该对象具有 mysql2 不需要/不需要的附加参数。我是打字稿的新手。在将对象传递给 MysqlConnector 类之前,我尝试了这个:

let forDeletion = ['type', 'alreadyData']
connector = new MysqlConnector(credentials.filter(item => !forDeletion.includes(item)))

但我收到一个错误,说“过滤器”不是“DatabaseCredentials”类型的属性,我得出结论这可能不是正确的方法。

我假设 Typescript 中有一种方法(通过 tsconfig)可以自动过滤掉不在接收类型中的属性。 “MysqlConnectionDetails”在其定义中没有属性“类型”,因此当我传入另一种类型时,它会动态获取它。

【问题讨论】:

【参考方案1】:

不确定是否有特定的 TypeScript 方法来处理此问题,但您可以为此使用解构/扩展:

const  type, ...validCredentials  = credentials;

这实质上是从凭据中挑选出type,而validCredentials 将包含其余属性。

.filter 不起作用的原因是 filter 是数组的原型方法,而不是对象。

【讨论】:

我得到这个错误:类型'MysqlConnectionDetails'没有属性'type'并且没有字符串索引签名。我创建了一个通用要点来说明我正在尝试做的事情:gist.github.com/jamesmbowler/7d014f9000fb7376174415ce6ba8c12a 在您的要点中,我认为您的测试函数需要接受DatabaseCredentials 类型的参数,而不是MysqlConnectionDetails。您还应该console.log(validCredentials) 而不是connectionDetails 如果我取消注释这一行,const type, ...validCredentials = connectionDetails;,我得到一个错误:类型'MysqlConnectionDetails'没有属性'type'并且没有字符串索引签名。这就是为什么我没有记录 validCredentials。重点是我想从“父”(引号,因为它不是真正的父)转换为 MysqlConnectionDetails,它具有 mysql2 的正确参数。 getDbCredentials() 返回DatabaseCredentials 类型的对象。您正在将该对象传递给 test 函数。 test 函数期望接收MysqlConnectionDetails 类型的对象。您需要将test 函数更改为:function test(connectionDetails:DatabaseCredentials)【参考方案2】:

如果你坚持使用 Array 方法,.map() 可能是最有帮助的:

let obj2big =  a: 1, b: 2, c: 3 

// let's assume what you want from this is  a: 1, c: 3 

let arr = [obj2big]

let result = arr.map(i=>(a:i.a, c: i.c))

console.log(result[0])

【讨论】:

以上是关于过滤掉打字稿中接口的不需要的对象属性的主要内容,如果未能解决你的问题,请参考以下文章

如何在打字稿中过滤对象数组

如何故意在打字稿中定义一个“空接口”

根据打字稿中的请求参数设置猫鼬的查询过滤器

如何在打字稿中对模型接口进行单元测试?

如何在打字稿中组合对象属性?

在打字稿中应用箭头函数作为对象属性