2013-08-29 4 views
5

Sto tentando di testare un esempio piuttosto forzato nel parco giochi su Typescriptlang.org. La mia interfaccia INewable specifica un argomento del costruttore di stringa singola. Nel corpo del mio metodo factory non rispetto questo vincolo (usando un numero o chiamando con una lista di argomenti void). Non ricevo un errore per quanto riguarda l'avviso o l'avvertimento.Dattiloscritto: nuovo() Contratto di interfaccia non applicato

Ho fatto qualcosa di sbagliato o si tratta di un bug?

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()); 

EDIT: La forma più semplice:

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

presenta lo stesso problema.

risposta

2

Bella cattura. È un bug nel compilatore. campione più semplice:

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

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

Fondamentalmente penso che la sua causa è di tipo Tany all'interno di una voce generica. Ciò confonde il compilatore e alcune parti di esso (non del tutto) pensano che ctor sia anche any.

E.g. il seguente non è un errore:

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

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

Ma il seguente fa:

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

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

puoi segnalarlo qui: https://typescript.codeplex.com/workitem/list/basic, e se lo fai mi farebbe piacere un link così posso votare la bug