javascript - filtrera bort onödiga objekt-egenskaper för gränssnitt i typescript


Som bakgrund använder jag Prisma (graphql), mysql2 (nodejs) och typescript.

Jag använder ett interaktivt kommandoradsskript för att ansluta till mysql2.

Detta är varningen jag ser:

Ignorerar ogiltigt konfigurationsalternativ som skickats till Connection: type. Detta är för närvarande en varning, men i framtida versioner av MySQL2 kommer ett fel att kastas om du skickar ett ogiltigt konfigurationsalternativ till en Connection

Så här instansierar jag mysql2 i min MysqlConnector-klass:

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

"connectionOptions" är inställt i klasskonstruktören:

constructor(connectionDetails: MysqlConnectionDetails) {

Detta är min typdefinition:

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

Detta är typdefinitionen av objektet som jag skickar till min MysqlConnector-klass:

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

Så, jag skickar in ett objekt som har ytterligare parametrar som mysql2 inte vill ha/behöver. Jag är ny på Typescript. Jag försökte detta, innan jag skickade in objektet till MysqlConnector-klassen:

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

Men jag får ett fel som säger att "filter" inte är en egenskap på typen "DatabaseCredentials", och jag drog slutsatsen att detta förmodligen inte är rätt sätt att göra det på.

Jag antog att det finns ett sätt i Typescript (genom tsconfig) att automatiskt filtrera bort egenskaper som inte finns i den mottagande typen. "MysqlConnectionDetails" har inte en egenskap "type" i sin definition, så den får den dynamiskt när jag skickar in en annan typ.

Svar #1

Osäker på om det finns ett specifikt TypeScript-sätt att hantera detta, men du kan använda destrukturering/spread för detta:

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

Detta plockar i princip type ur credentials, och validCredentials kommer att innehålla resten av egenskaperna.

Anledningen till att .filter inte fungerade är att filter är en prototypmetod på arrayer, inte på objekt.

Svar #2

Om du insisterar på att använda Array-metoder, är .map() förmodligen mest användbar:

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])