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