5

我正在尝试在 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
}

表现出相同的错误。

4

1 回答 1

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.

例如,以下不是错误:

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 ,如果您这样做,我将不胜感激一个链接,以便我可以对该错误进行投票

于 2013-08-29T11:27:20.180 回答