knockout.js - Använd Typescript för att beskriva en klass med dynamiskt tillagda egenskaper


Jag försöker lägga till Typescript-definitioner till en befintlig kodbas som råkar använda Knockout-biblioteket. Koden innehåller ett mycket vanligt mönster som ser ut så här:

interface SomeProperties {
    // A bunch of properties
}

class ViewModel {
    // Some properties of my own...

    constructor(data: SomeProperties) {
        AddAllPropertiesToThis(data);
    }
}

Där AddAllPropertiesToThis tar dataobjektet och dynamiskt lägger till alla dess egenskaper till this.

Jag kan inte lista ut hur jag ska uttrycka detta mönster i Typescript. Det är logiskt att säga något i stil med

class ViewModel implements SomeProperties

men detta kräver att man manuellt kopierar alla egenskaper från gränssnittsdefinitionen till klassen.

Finns det något sätt att åstadkomma det jag behöver göra här utan att behöva skriva ut redundanta egenskaper?

Svar #1

Du kan introducera en medlemsvariabel data: SomeProperties i ViewModel.

interface SomeProperties {
    // A bunch of properties
}

class ViewModel {
    data: SomeProperties;

    constructor(data: SomeProperties) {
        // deep copy the data
        this.data = { ...data };
    }
}

För mig är det mer logiskt att göra det genom komposition som koden ovan snarare än arv. ViewModel innehåller (har) SomeProperties. Det är inte en utökning av SomeProperties ("är en"-relation).