2012-10-09 38 views
31

Cách thêm phương thức vào loại cơ sở, hãy nói Array? Trong mô-đun toàn cầu, mô-đun này sẽ được công nhậnMở rộng mảng trong TypeScript

interface Array { 
    remove(o): Array; 
} 

nhưng ở đâu để thực hiện thực tế?

+0

Giải pháp rất đơn giản mà tôi đã trả lời ở đây - http://stackoverflow.com/questions/14867649/adding-a-property-to-array-in-typescript/33573875#33573875 – Vukasin

Trả lời

42

Bạn có thể sử dụng nguyên mẫu để mở rộng mảng:

interface Array<T> { 
    remove(o: T): Array<T>; 
} 

Array.prototype.remove = function (o) { 
    // code to remove "o" 
    return this; 
} 
+1

@FrancoisVanderseypen có thể là một nỗi đau, Tôi đề nghị bạn không thử nó. Nó được dễ dàng hơn cách được đề xuất ở đây. Nhưng nếu bạn tò mò: http://stackoverflow.com/a/14001136/340760 – BrunoLM

+0

nó phải là 'interface Array {remove (o): T []; } 'trong phiên bản mới với generics –

+0

Không hoạt động nếu module ở bên ngoài. –

5

Từ nguyên cảo 1.6, bạn có thể "tự nhiên" mở rộng biểu thức tùy ý như các loại sẵn có.

What's new in TypeScript:

nguyên cảo 1.6 thêm hỗ trợ cho các lớp học kéo dài tùy ý biểu rằng tính một hàm constructor. Điều này có nghĩa là các kiểu dựng sẵn bây giờ có thể được mở rộng trong các khai báo lớp.

Điều khoản mở rộng của một lớp trước đây yêu cầu tham chiếu loại được chỉ định. Nó bây giờ chấp nhận một biểu thức tùy chọn theo sau là một danh sách đối số loại . Loại biểu thức phải là một hàm tạo loại hàm có ít nhất một chữ ký xây dựng có cùng số tham số kiểu là số đối số kiểu được chỉ định trong mệnh đề mở rộng là . Kiểu trả về của cấu trúc phù hợp chữ ký là loại cơ sở mà từ đó loại cá thể loại kế thừa. Có hiệu quả, điều này cho phép cả các lớp thực và các biểu thức "giống như lớp" được chỉ rõ trong mệnh đề mở rộng.

// Extend built-in types 

class MyArray extends Array<number> { } 
class MyError extends Error { } 

// Extend computed base class 

class ThingA { 
    getGreeting() { return "Hello from A"; } 
} 

class ThingB { 
    getGreeting() { return "Hello from B"; } 
} 

interface Greeter { 
    getGreeting(): string; 
} 

interface GreeterConstructor { 
    new(): Greeter; 
} 

function getGreeterBase(): GreeterConstructor { 
    return Math.random() >= 0.5 ? ThingA : ThingB; 
} 

class Test extends getGreeterBase() { 
    sayHello() { 
     console.log(this.getGreeting()); 
    } 
} 
+1

Điều này dẫn đến các vấn đề, trong đó toán tử '[]' không hoạt động như mong đợi. http://stackoverflow.com/questions/33947854/class-extended-from-built-in-array-in-typescript-1-6-2-does-not-update-length-wh –

+0

@AndrewShepherd Rất tốt bắt. – Alex

23

declare global có vẻ là vé như các nguyên cảo 2.1. Lưu ý rằng Array.prototype thuộc loại any[], vì vậy nếu bạn muốn kiểm tra chức năng triển khai chức năng của mình để nhất quán, tốt nhất bạn nên thêm thông số loại chung chung.

declare global { 
    interface Array<T> { 
    remove(elem: T): Array<T>; 
    } 
} 

if (!Array.prototype.remove) { 
    Array.prototype.remove = function<T>(elem: T): T[] { 
    return this.filter(e => e !== elem); 
    } 
} 
3
class MyArray<T> extends Array<T> { 
    remove: (elem: T) => Array<T> = function(elem: T) { 
     return this.filter(e => e !== elem); 
    } 
} 
let myArr = new MyArray<string>(); 
myArr.remove("some"); 

làm việc này cho tôi với v2.2.1 nguyên cảo!

Các vấn đề liên quan