javascript - Mở rộng Object.prototype với TypeScript
Hiện tại tôi đang làm việc trên một API TypeScript, điều này yêu cầu một số tính năng bổ sung gắn với prototype của Object (Object.prototype).
Xem xét đoạn mã sau:
class Foo {
}
interface Object {
GetFoo(): Foo;
GetFooAsString(): string;
}
//This is problematic...
Object.prototype.GetFoo = function() {
return new Foo();
// Note, this line is just for testing...I don't want my function to just return a blank instance of Foo!
}
//This is ok.
Object.prototype.GetFooAsString = function () {
return this.GetFoo().toString();
}
Bạn có thể muốn thử cái này trực tiếp tại Playground.
Như bạn có thể thấy, tôi có một lớp gọi là Foo (không phải tên đối tượng thực tế mà tôi sẽ sử dụng). Tôi cũng đã mở rộng giao diện Object để bao gồm hai hàm mới. Cuối cùng, tôi đã triển khai các hàm này trên prototype (chúng hoạt động trong JavaScript thuần, chỉ có TypeScript là báo lỗi).
Ở nơi tôi đã chú thích "//this is problematic..." TypeScript sẽ đánh dấu bằng một đường gợn đỏ và hiển thị lỗi sau:
C
Hoặc đây chỉ là một lỗi của TypeScript (tôi biết nó vẫn đang trong giai đoạn phát triển, nên có nhiều lỗi cần được khắc phục, và tôi đã minh họa một số trong số này trên CodePlex rồi), hoặc, tôi đang bỏ sót điều gì đó.
Tại sao tôi lại gặp vấn đề này?
Nếu đó không phải là lỗi của TypeScript, làm thế nào tôi có thể sửa nó?
Câu trả lời #1
Tôi đã từng có:
// See if an array contains an object
Array.prototype.contains = function (obj) {
var i = this.length;
while (i--) {
if (this[i] === obj) {
return true;
}
}
return false;
}
để mã đó có thể biên dịch với Typescript, tôi đã thêm dòng:
interface Array {
contains(obj: Object): boolean;
}
Cảm ơn basarat!
Câu trả lời #2
Lỗi này đã được sửa trong TS 0.9.0 alpha như bạn có thể thấy bên dưới:
Khu vui chơi vẫn đang chạy phiên bản 0.8.3.
Điều này cơ bản xảy ra vì các phương thức trên một số giao diện chính (Object, Number, String, v.v.) được lưu trong bộ nhớ đệm như một tối ưu hóa hiệu suất.
Nếu bạn chạy cái này. Lần đầu tiên nó tải, bạn sẽ không thấy lỗi đó. Hãy thử đi.
Ngay khi bạn chỉnh sửa mã đó, trình phân tích cú pháp sẽ duyệt lại mã, và vì nó đã lưu trữ định nghĩa giao diện cũ nên thấy một định nghĩa hàm trùng lặp và sau đó thực sự gặp lỗi. Càng chỉnh sửa nhiều vào tệp đó, thông báo lỗi sẽ càng trở nên phức tạp.
