2015-08-17 4 views
5

Mi piacerebbe che l'implementazione statica di un metodo statico utilizzi il valore della classe derivata. Ad esempio, nel semplice esempio seguente, quando chiamo User.findById() voglio che utilizzi il tableName overridden User quando si esegue l'implementazione definita nella classe base SqlModel.Come sovrascrivere le variabili statiche dalle classi derivate inehirted in typescript

Come faccio ad accertarmi che le classi di base statiche tableName utilizzino 'Utente' e sia questo il modo giusto di dichiarare essenzialmente una proprietà statica astratta?

class SqlModel { 

    protected static tableName:string; 

    protected _id:number; 
    get id():number { 
     return this._id; 

    } 

    constructor(){ 

    } 

    public static findById(id:number) { 
     return knex(tableName).where({id: id}).first(); 
    } 

} 

export class User extends SqlModel { 

    static tableName = 'User'; 

    name:string; 

    constructor(username){ 
     this.name = username; 
    } 
} 

E vorrei ottenere un errore che dice nometabella non è definito, ma se dico SqlModel.tableName allora non utilizzare le classi nome tabella derivata

User.findById(1); //should call the knex query with the tablename 'User' 

risposta

5

È possibile utilizzare this.tableName:

class SqlModel { 
    protected static tableName: string; 

    public static outputTableName() { 
     console.log(this.tableName); 
    } 
} 

class User extends SqlModel { 
    protected static tableName = 'User'; 
} 

User.outputTableName(); // outputs "User" 
+1

non funziona in dattiloscritto> 1.8 Credo. Esiste una soluzione: (this.constructor come qualsiasi) .tableName come mostrato qui: http://stackoverflow.com/questions/37727307/referencing-class-without-name-to-use-different-static-method-in- sottoclasse-in-t – Dominik

+0

@Dominik la differenza è che in questo caso la domanda sta chiedendo di un metodo statico -findById'-non un metodo di istanza. –

+0

Hai ragione, grazie per ulteriore spiegazione :) – Dominik

1

Scuse - Non riesco ancora a commentare StackOverflow - mi dispiace per la "risposta".

In risposta a David - non sembra che funziona davvero (tipografico 1.7.6)

nel tuo esempio - l'errore di compilazione sarebbe

Proprietà 'tableName' non esiste sul tipo 'SqlModel'

È possibile utilizzare SqlMode.tableName .. ma che rimanda al problema originale.

L'unico modo che ho trovato intorno a questo è di creare invece una funzione astratta (non statica) e avere la classe derivata restituire il valore (ad esempio, getTableName()). Questa non è una buona pratica e sarebbe un no-no in C# a meno che il metodo della classe derivata fosse sigillato pure (specialmente cercando di accedervi nel costruttore - che è ovviamente dove ne ho bisogno!)

1

Sono riuscito a ottenere la statica in questo modo:

(<typeof SqlModel> this.constructor).tableName 
Problemi correlati