我正试图在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
}
表现出同样的错误。
答案 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,如果你这样做,我会很感激链接,所以我可以对错误进行投票