2017-08-24 3 views
0

Ich habe eine grundlegende generische Klasse BaseModel und eine Reihe von Unterklassen, die die Modelle zu meiner Lösung sind. Was ich tun möchte ist so etwas wie:Definieren einer Teilmenge der Klasse als Schnittstelle

export default class Person extends Model { 
    public firstName: string; 
    public lastName: string; 
    public age: number; 
    protected modelName: 'person'; 
} 

Und in der Model Klasse sagen wir, wir haben:

export default abstract class Model { 
    public lastUpdated: string; 
    public createdAt: string; 
    protected abstract modelName: string; 
    // Public API 
    public update(key, payload: any) { ... } 
    public remove(key) { ... } 
} 

Also, was ich möchte zur Entwurfszeit bereitstellen können, ist eine Schnittstelle, die alle öffentlichen Eigenschaften besitzt, aber die API-Funktionen ausschließt. Ist das in Typoskript möglich?


p.s. Ich erwäge auch die Möglichkeit, die experimentellen Dekorateure der Verwendung Funktion, so dass das obige Person Modell aussehen könnte:

export default class Person extends Model { 
    @property firstName: string; 
    @property lastName: string; 
    @property age: number; 
    protected modelName: 'person'; 
} 

nicht sicher, ob dies keine zusätzliche Möglichkeiten bietet mein Ziel als Dekorateure in JS ist Neuland zu erreichen, die für mich.

Antwort

0

Ja, Sie können eine Schnittstelle erstellen, um die öffentlichen Eigenschaften zu platzieren und diese Schnittstelle dann in der abgeleiteten Klasse zu implementieren. Sie können die Basisklasse auch in derselben abgeleiteten Klasse erben.

export interface IMyInterface { 
    firstName: string; 
    lastName: string; 
    age: number; 
    lastUpdated: string; 
    createdAt: string; 
} 

export default abstract class Model { 
    protected abstract modelName: string; 
    // Public API 
    public update(key:any, payload: any) { ... } 
    public remove(key:any) { ... } 
} 



export default class Person extends Model implements IMyInterface { 
    protected modelName:string = 'person'; 
    //implement other properties here 
    constructor(){ 
     super(); 
    } 

} 
+0

Ja, das ist wahr, aber was ich hoffe, ist nicht die Schnittstelle _and_ definieren müssen dann die öffentlichen Eigenschaften der Klasse hinzufügen. Scheint so etwas wie ein TS-Zupfen/Pick/oder gemappte Tasten könnten dies erreichen? Es wäre sehr möglich, auch eine Schnittstelle für die API zu definieren, und dann kann ich die API von der öffentlichen Schnittstelle ausschließen? – ken

Verwandte Themen