2013-08-29 9 views
5

Próbuję przetestować raczej wymyślony przykład na placu zabaw na Typescriptlang.org. Mój interfejs INEwable określa pojedynczy argument konstruktora ciągu. W treści mojej metody fabrycznej nie przestrzegam tego ograniczenia (używając numeru lub wywołując listę nieważnych argumentów). Nie otrzymuję błędnego błędu ani ostrzeżenia.Opis maszynowy: new() Umowa z interfejsem nie jest wymuszana

Czy zrobiłem coś złego, czy to błąd?

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: prostsza forma:

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

wykazuje taki sam błąd.

Odpowiedz

2

Przyjemny połów. Jest to błąd w kompilatorze. Prostsze próbki:

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

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

Zasadniczo myślę, że jego ponieważ T jest typu any wewnątrz elementu ogólnej. To mylące kompilator i jego części (nie do końca), myślę, że ctor jest także any.

E.g. poniższych nie jest błąd:

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

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

Ale dodaje się robi:

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

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

Można go zgłosić tutaj: https://typescript.codeplex.com/workitem/list/basic, a jeśli nie byłbym wdzięczny link więc mogę głosować na bug

Powiązane problemy