2015-03-03 16 views
5

Tôi đang sử dụng các mô-đun AMD (cờ trình biên dịch "--module amd") trong dự án TypeScript của tôi. Trong khi tôi có thể easily use getters/setters on my classes Tôi muốn làm điều tương tự trên module của tôi, nhưnggetter/setter trên một mô-đun trong TypeScript

export get abc() : string { 
    return "abc"; 
} 

lợi nhuận

lỗi TS1008: dấu hiệu bất ngờ; 'mô-đun, lớp, giao diện, enum, nhập hoặc tuyên bố' được mong đợi.

export function get abc() : string { 
    return "abc"; 
} 

lợi nhuận

lỗi TS1005:. '(' Dự kiến ​​

Tôi đang làm gì sai

+1

thể trùng lặp của [Properties trong một module] (http://stackoverflow.com/questions/20925921/properties-in-a-module) – Acidic

Trả lời

7

Bạn chỉ có thể thêm thu khí? và định cư tại một lớp học vào lúc này .

Việc chuyển đổi mã TypeScript sử dụng trên getters và setters thêm thuộc tính vào nguyên mẫu của đối tượng, điều này có ý nghĩa hơn đối với các lớp so với mô-đun.

+1

không module vốn Đối tượng quá? Tôi nghĩ getter/setter sẽ có sẵn trên bất kỳ đối tượng nào. –

+0

@ daniel.sedlacek không phải khi đối tượng có một nguyên mẫu không xác định –

+0

@ daniel.sedlacek Lớp getter/setters có sẵn trên cá thể của lớp, không phải là đối tượng lớp (nghĩa là hàm).Bạn có thể sử dụng getters/setters tĩnh trên một lớp và sau đó hợp nhất định nghĩa với một module. Loại mô-đun sẽ hoạt động. –

4

này là có thể, bằng cách sử dụng export = ... cú pháp đặc biệt như sau:

class MyModule { 
    get abc() { 
     return "abc"; 
    } 
} 

var myModule = new MyModule(); 
export = myModule; 

Điều này làm cho một thể hiện của hành động lớp MyModule như API của module. Bạn không cần phải đặt bất kỳ dữ liệu nào trong lớp - chỉ cần di chuyển các hàm của bạn vào đó và nếu không thì chúng sẽ không thay đổi. Nhược điểm là nếu chức năng a cuộc gọi chức năng b nó sẽ phải nói this.b() hoặc myModule.b() (sau này là gần gũi hơn với một mô-đun xuất khẩu bình thường).

Ngoài ra, bạn phải khai báo biến được đặt tên trước tiên. Bạn không thể chỉ nói:

export = new MyModule(); // This doesn't work 
0

Chỉ cần để tham khảo của du khách trong tương lai ...

Tương tự như những gì @Daniel Earwicker đang nói và giải thích những gì @ billc.cn đã nói, bạn cũng có thể conflate một lớp với một không gian tên và sau đó chỉ cần xác định getter/setter như một phương pháp tĩnh:

export class X { 
    static get abc():string { 
     return "abc"; 
    } 
} 

export namespace X { 
    // ... other code 
} 

Nhưng điều này có nghĩa là bạn sẽ có một không gian tên trong thư viện của bạn (mô-đun) và trừ khi bạn muốn thay đổi cách mà bạn giải quyết thuộc tính của thư viện của bạn, bạn sẽ phải thực hiện hack export = X; mà @Daniel Earwicker đã đề cập.

https://www.typescriptlang.org/docs/handbook/declaration-merging.html

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