2016-12-11 33 views
5

Statik bir öznitelik ve başka bir genel sınıf Controller<T extends Model> olan bir özet sınıf Model var. Modelin statik özniteliğine bir Denetleyici örneğinde erişmek istiyorum. Yani bu gibi olmalıdır:Typescript erişim genel türünün statik özniteliği

abstract class Model{ 
    static hasStatus: boolean = false; 
} 

class MyModel extends Model{ 
    static hasStatus = true; 
} 

class Controller<T extends Model>{ 
    constructor(){ 
     if(T.hasStatus)... 
    } 
} 

Fakat TS bunu başarmak için kolay bir yol var mı 'T' only refers to a type, but is being used as a value here.

diyor? Veya Model'un her bir mirası için Controller alt sınıfını almalı ve değeri almak için bir yöntem mi kullanmalıyım?

+0

'' Denetleyici' oluşturulurken 'T' nasıl bağlanır? –

cevap

3

Bunu yazı tipinde yapmanın bir yolu yoktur. Genel tip parametreleri yalnızca türlerin bildirimlerde görünebileceği, çalışma zamanında erişilemediği yerlerde görünebilir. Bunun nedeni basittir - genel sınıfın her bir yöntemi için tek javascript işlevi oluşturulur ve bu işlevin, gerçek türün genel tür parametresi olarak geçtiğini bilmesinin bir yolu yoktur.

İşte
class Controller<T extends Model>{ 
    constructor(cls: typeof Model){ 
     if (cls.hasStatus) { 
     } 
    } 
} 

let c = new Controller<MyModel>(MyModel); 

noktayı açıklamak için javascript derlenmiş zaman nasıl görünüyor şudur: zamanında bu bilgileri gerekiyorsa

, bunu çağrılırken kurucusuna bir parametre eklemek ve bir tür kendinizi geçmek zorunda - orada genel parametrelerin kaldığı hiçbir şey yoktur ve cls parametresini kaldırırsanız, hasStatus'un nereden gelmesi gerektiği hakkında hiçbir bilgi yoktur.

var Controller = (function() { 
    function Controller(cls) { 
     if (cls.hasStatus) { 
     } 
    } 
    return Controller; 
}()); 
var c = new Controller(MyModel); 
İlgili konular