2013-08-29 5 views
5

Ich versuche ein eher künstliches Beispiel auf dem Spielplatz auf Typescriptlang.org zu testen. Meine INewable-Schnittstelle gibt ein einzelnes String-Konstruktorargument an. Im Körper meiner Factory-Methode respektiere ich diese Einschränkung nicht (entweder durch Verwendung einer Zahl oder durch Aufruf einer Leerstellen-Argumentliste). Ich erhalte keinen Fehler, schelmisch oder Warnung.Typescript: new() Interface contract not erzwungen

Habe ich etwas falsch gemacht oder ist das ein Fehler?

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: Die einfachere Form:

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

zeigt die gleichen Fehler.

Antwort

2

Schöner Fang. Es ist ein Fehler im Compiler. Einfachere Beispiel:

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

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

Grundsätzlich denke ich sein, weil T vom Typ any innerhalb eines generischen Elements. Das verwirrt den Compiler und Teile davon (nicht ganz) denken ctor ist auch any.

z. Folgendes ist kein Fehler:

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

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

Aber folgendes tut:

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

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

Sie hier melden: https://typescript.codeplex.com/workitem/list/basic, und wenn Sie ich einen Link zu schätzen wissen würde, so kann ich Abstimmung über den Fehler

Verwandte Themen