generikler - Typescript: new() Arayüz sözleşmesi zorunlu kılınmadı


Typescriptlang.org üzerindeki playgroundda oldukça yapay bir örneği test etmeye çalışıyorum. INewable arayüzüm tek bir string yapıcı parametresi belirtiyor. Fabrika yöntemimin içinde bu kısıtlamaya uymuyorum (ya bir sayı kullanarak ya da boş bir argüman listesi ile çağırarak). Hiçbir hata çizgisi veya uyarı almıyorum.

Bir şey mi yanlış 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 hali:

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

aynı hatayı gösteriyor.

Cevap #1

İyi yakalama. Bu derleyicide bir hata. Daha basit örnek:

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

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

Temelde bence bunun nedeni, bir genel öğe içinde T'nin any türünde olmasıdır. Bu, derleyiciyi kafa karıştırıyor ve onun bazı bölümleri (tam olarak değil) ctor'un da any olduğunu düşünüyor.

Örneğin, aşağıdaki bir 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 aşağıdaki yapar:

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

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

Bunu şuradan bildirebilirsiniz: https://typescript.codeplex.com/workitem/list/basic, ve yaparsanız, hataya oy verebilmem için bir bağlantı paylaşmanızı takdir ederim

İlgili makaleler