2013-08-29 91 views
5

Tôi đang cố gắng thử nghiệm một ví dụ khá giả vờ trong sân chơi trên Typescriptlang.org. Giao diện INewable của tôi chỉ định một đối số hàm tạo chuỗi đơn. Trong phần thân của phương thức factory của tôi, tôi không tôn trọng ràng buộc này (hoặc bằng cách sử dụng một số hoặc gọi với một danh sách đối số void). Tôi không nhận được một lỗi squigly hoặc cảnh báo.Loại bản ghi: mới() Hợp đồng giao diện không được thực thi

Tôi đã làm điều gì sai hoặc đây có phải là lỗi không?

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: Các hình thức đơn giản:

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

triển lãm cùng một lỗi.

Trả lời

2

Rất thú vị. Đó là một lỗi trong trình biên dịch. mẫu đơn giản:

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

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

Về cơ bản tôi nghĩ nó vì T là loại any trong vòng một mục chung. Điều đó gây nhầm lẫn cho trình biên dịch và các phần của nó (không hoàn toàn) nghĩ rằng ctor cũng là any.

Ví dụ: dưới đây không phải là một lỗi:

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

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

Nhưng sau không:

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

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

Bạn có thể báo cáo nó tại đây: https://typescript.codeplex.com/workitem/list/basic, và nếu bạn làm Tôi đánh giá cao một liên kết để tôi có thể biểu quyết về việc lỗi