c# - "Kiểu Cấu Trúc cho Giao Diện" trong TypeScript là gì
Trong bài đăng trên blog của mình về TypeScript, Mark Rendle nói rằng, một trong những điều anh ấy thích về nó là:
Kiểu cấu trúc cho các interface. Tôi thực sự ước C# có thể làm được điều đó
Ý anh ấy muốn nói gì với điều đó?
Câu trả lời #1
Về cơ bản, điều đó có nghĩa là các giao diện được so sánh dựa trên cơ sở 'duck typing' thay vì dựa trên cơ sở nhận dạng kiểu.
Hãy xem xét đoạn mã C# sau:
interface X1 { string Name { get; } }
interface X2 { string Name { get; } }
// ... later
X1 a = null;
X2 b = a; // Compile error! X1 and X2 are not compatible
Và đoạn mã TypeScript tương đương:
interface X1 { name: string; }
interface X2 { name: string; }
var a: X1 = null;
var b: X2 = a; // OK: X1 and X2 have the same members, so they are compatible
Đặc tả không đề cập chi tiết nhiều về điều này, nhưng các lớp có "thương hiệu", có nghĩa là cùng một đoạn mã, được viết với các lớp thay vì giao diện, sẽ gặp lỗi. Các giao diện trong C# có thương hiệu, và do đó không thể được chuyển đổi ngầm định.
Cách đơn giản nhất để nghĩ về điều này là nếu bạn đang cố gắng chuyển đổi từ giao diện X sang giao diện Y, nếu X có tất cả các thành viên của Y, việc chuyển đổi sẽ thành công, ngay cả khi X và Y có thể không có cùng tên.
