2013-08-29 22 views
5

Typescriptlang.orgの遊び場で、やや工夫した例を試そうとしています。私のINewableインターフェイスは、単一の文字列コンストラクタ引数を指定します。私のファクトリメソッドの本体では、この制約を尊重しません(数値を使うかvoid引数リストを使って呼び出します)。私は間違いや警告を受けていません。Typescript:new()インタフェース契約が強制されていません

私は何か間違ったことをしましたか、これはバグですか?

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:単純な形式:

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

が同じバグを示します。

答えて

2

ニースキャッチ。コンパイラのバグです。シンプルなサンプル:

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

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

基本的に私はTは、一般的な項目の中にタイプanyであり、そのためだと思います。それはコンパイラとその部分(全くではない)が混乱していると思います。ctoranyです。

など。次はエラーではありません。

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

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

しかし、次のことを行います。

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

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

あなたがそれをここに報告することができます:https://typescript.codeplex.com/workitem/list/basicを、そしてあなたがしなければ、私はに投票できますので、私はリンクをいただければと思いますバグ

関連する問題