Typescript:new()未强制执行接口契约

时间:2013-08-29 10:35:14

标签: generics interface constructor typescript

我正试图在Typescriptlang.org的操场上测试一个相当人为的例子。我的INewable接口指定单个字符串构造函数参数。在我的工厂方法的主体中,我不尊重这个约束(通过使用数字或使用void参数列表调用)。我没有得到错误的警告或警告。

我做错了什么或者这是一个错误吗?

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

编辑:更简单的形式:

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

表现出同样的错误。

1 个答案:

答案 0 :(得分: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类型。这使编译器及其部分(并非完全)混淆,认为ctor也是any

E.g。以下不是错误:

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,如果你这样做,我会很感激链接,所以我可以对错误进行投票