2014-10-03 13 views
7

Chúng tôi có một getter điển hình tại một trong các lớp học của chúng tôi, cho phép nóiChữ ký giao diện TypeScript cho thuộc tính mà không cần setter.

class Employee implements IEmployee { 
    private _fullName: string; 

    get fullName(): string { 
     return this._fullName; 
    } 
} 

và một giao diện để làm việc với nó

interface IEmployee{ 
    fullName: string; 
} 

Khi làm việc với một thể hiện thông qua giao diện này trình biên dịch sẽ không cảnh báo chúng tôi về sự vắng mặt của một setter nếu chúng ta cố gắng gán cho fullName, và thời gian chạy JS chỉ đơn giản là nuốt bất kỳ nhiệm vụ nào và không ném một lỗi. Có cách nào để đánh dấu thành viên giao diện như chỉ có getter hoặc chỉ setter?

Tôi đã xem this post, nhưng nó khá cũ, tôi muốn biết, nếu có gì được cải thiện.

+0

Thực sự ngạc nhiên vì thiếu hoạt động cho câu hỏi này. Các thuộc tính chỉ đọc là vô cùng hữu ích và là một trong những mẫu đầu tiên mà tôi đã cố gắng triển khai trong TypeScript. – gravidThoughts

Trả lời

1

Đây là một câu hỏi thú vị. Khái niệm về một thuộc tính chỉ đọc là khác nhau một cách tinh tế trong TypeScript với các ngôn ngữ khác.

Trong nhiều ngôn ngữ, một thuộc tính có trình khởi động (nhưng không có trình cố định) sẽ làm tăng lỗi trình biên dịch nếu bạn cố đặt thuộc tính, nhưng TypeScript thì không.

Thuộc tính vẫn là chỉ đọc, bởi vì nó không có sự khác biệt nếu bạn cố gắng đặt; bộ sẽ không âm thầm.

Dưới đây là một ví dụ mà không cần bất kỳ giao diện:

class Example { 
    get name() { 
     return 'Steve'; 
    } 
} 

var y = new Example(); 
y.name = 'Example 2'; 
alert(y.name); 

Không có cảnh báo trình biên dịch khi tôi sử dụng x.name = 'Example 2';.

Nếu có cảnh báo trình biên dịch, tôi sau đó sẽ mong đợi có cách xác định nguyên lý chỉ đọc của thuộc tính trong giao diện. Như bạn mong đợi, mặc dù được cung cấp thông tin trên, bạn không thể đặt thuộc tính chỉ đọc trên giao diện.

interface Test { 
    name: string; 
} 

class Example { 
    get name() { 
     return 'Steve'; 
    } 
} 

var x: Test = new Example(); 
x.name = 'Example 1'; 
alert(x.name); 

var y = new Example(); 
x.name = 'Example 2'; 
alert(x.name); 

này nghĩa là bạn chỉ có thể thực thi readonly-Ness bằng việc có một phương pháp để có được giá trị của tài sản (và rõ ràng là không có phương pháp cho phép nó được thiết lập).

interface Test { 
    getName:() => string; 
} 

class Example { 
    getName() { 
     return 'Steve'; 
    } 
} 

var x: Test = new Example(); 
//x.getName('Obviously not'); 
//x.getName() = 'Obviously not'; 
alert(x.getName()); 

var y = new Example(); 
//y.getName('Obviously not'); 
//y.getName() = 'Obviously not'; 
alert(y.getName()); 
+0

Readonlyness được thực thi khá nhiều bởi hành vi JS trong trường hợp không có setter. Vấn đề là bản chất im lặng của nó - lặng lẽ nuốt giá trị. Giải pháp lý tưởng (và hy vọng đến) sẽ cho phép các thành viên giao diện TS được đánh dấu là chỉ có getter \ setter. Thay thế sẽ là cho transpiler để tạo ra setter getter trống khi không có nó, mà chỉ đơn giản là sẽ ném một lỗi (ít nhất là cho một setter đây là hành vi toàn bộ nhóm của chúng tôi dự kiến). Các giải pháp tẻ nhạt cuối cùng sẽ luôn luôn làm cho một setter ném bằng tay nếu không có setter thực tế là cần thiết. –

+0

'Readonlyness được thực thi khá nhiều bởi hành vi JS trong trường hợp không có setter.' có - mặc dù bằng" bắt buộc ", tôi đã nói nhiều hơn về cảnh báo trình biên dịch, đường màu đỏ và một số loại báo động âm thanh. Mã ví dụ cho thấy việc loại bỏ im lặng của các nỗ lực thiết lập. Trong khi chờ đợi, việc sử dụng một phương thức để truy cập thuộc tính là cách duy nhất để có được thời gian biên dịch đảm bảo rằng không có nỗ lực nào được thiết lập. – Fenton

+0

Đã gây ra sự cố trên GitHub về vấn đề này https://github.com/Microsoft/TypeScript/issues/814 –

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