2013-08-29 25 views
5

Tipik olarak hazırlanmış bir örneği Kidscriptlang.org'daki oyun alanında test etmeye çalışıyorum. INewable arayüzüm, tek bir string yapıcı argümanını belirtir. Fabrika yöntemimin gövdesinde bu kısıtlamaya uymuyorum (bir numara kullanarak veya geçersiz bir argüman listesiyle arama yaparak). Dalgalı veya uyarı hatası almıyorum.Typescript: new() Arabirim sözleşmesi zorlanmamış

Yanlış bir şey mi yaptım yoksa bu bir hata mı?

interface INewable<T> { 

    new(param: string): T; 
} 

interface IToStringable { 

    toString(): string; 
} 

module Factory { 

    export function createInstance<T extends IToStringable>(ctor: INewable<T>): T { 

     return new ctor(1024); //why doesn't this fail? 
    } 
} 

var d = Factory.createInstance(Function); 

alert(d.toString()); 

DÜZENLEME: daha basit formu:

function createInstance<T>(ctor:new(s:string)=>T):T { 
    return new ctor(42); //why doesn't this fail either 
} 

sergiler aynı hata.

cevap

2

Güzel yakalamak. Derleyicide bir hata var. Daha basit örnek: T bir genel öğesi içindeki tip any ait olduğu için

interface INewable<T> { 
    new(param: string): T; 
} 

function createInstance<T>(ctor: INewable<T>): T { 
    return new ctor(1024); //why doesn't this fail? 
} 

Temelde ben onun düşünüyorum. Bu derleyici ve bölümlerini karıştırıyor (tamamen değil) düşünün ctor da any olduğunu.

E.g. Aşağıdaki hata değildir:

interface INewable<T> { 
    new(param: string,anotherparam): T; 
} 

function createInstance<T>(ctor: INewable<T>): T { 
    return new ctor(1024); //why doesn't this fail? 
} 

Ama şu yapar: https://typescript.codeplex.com/workitem/list/basic ve ben bir bağlantı takdir ediyorum yaparsanız bu yüzden de oy vererek:

interface INewable<T> { 
    anything(): T; 
} 

function createInstance<T>(ctor: INewable<T>): T { 
    return new ctor(1024); //fails 
} 

Sen buradan bildirebilirsiniz hata