отфильтровать ненужные свойства объекта для интерфейса в машинописи - PullRequest
0 голосов
/ 05 сентября 2018

В качестве фона я использую Prisma (graphql), mysql2 (nodejs) и машинопись.

Я использую интерактивный скрипт командной строки для подключения к mysql2.

Это предупреждение, которое я вижу:

Игнорирование неверного параметра конфигурации, переданного в Connection: type. это в настоящее время предупреждение, но в будущих версиях MySQL2 ошибка будет брошен, если вы передадите неверные параметры конфигурации Подключение

Вот как я создаю экземпляр mysql2 в моем классе MysqlConnector:

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 не хочет / не нуждается. Я новичок в Typescript. Я пробовал это, прежде чем передать объект в класс MysqlConnector:

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

Но я получаю ошибку, говоря, что «filter» не является свойством типа «DatabaseCredentials», и я пришел к выводу, что это, вероятно, неправильный способ сделать это.

Я предположил, что в Typescript (через tsconfig) есть способ автоматически отфильтровывать свойства, которые не относятся к получающему типу. «MysqlConnectionDetails» не имеет свойства «тип» в своем определении, поэтому он получает его динамически, когда я передаю другой тип.

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Если вы настаиваете на использовании методов 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])
0 голосов
/ 05 сентября 2018

Не уверен, есть ли определенный TypeScript способ справиться с этим, но вы можете использовать деструктуризацию / распространение для этого:

const { type, ...validCredentials } = credentials;

Это по существу выбирает type из учетных данных, а validCredentials будет содержать остальные свойства.

Причина, по которой .filter не работает, заключается в том, что фильтр является методом-прототипом для массивов, а не объектов.

...