Khi nào nên sử dụng Giao diện và Mô hình trong TypeScript / Angular2


197

Gần đây tôi đã xem Hướng dẫn về Angular 2 với TypeScript, nhưng không biết khi nào nên sử dụng Giao diện và khi nào nên sử dụng Mô hình để giữ cấu trúc dữ liệu.

Ví dụ về giao diện:

export interface IProduct {
    ProductNumber: number;
    ProductName: string;
    ProductDescription: string;
}

Ví dụ về mô hình:

export class Product {
    constructor(
        public ProductNumber: number,
        public ProductName: string,
        public ProductDescription: string
    ){}
}

Tôi muốn tải dữ liệu JSON từ một URL và liên kết với Giao diện / Mô hình. Thỉnh thoảng tôi muốn một đối tượng dữ liệu, lần khác tôi muốn giữ và mảng của đối tượng.

Tôi nên sử dụng cái nào và tại sao?


13
Sử dụng một lớp khi bạn cần init logic tùy chỉnh, nếu không thì luôn luôn sử dụng một giao diện vì điều này chỉ có sẵn tại thời gian biên dịch. Giao diện bản thảo không được biên dịch thành javascript vì nó không tồn tại trong javascript.
Dieterg

6
Hãy nhớ rằng các giao diện sẽ KHÔNG hoạt động với phép nội xạ phụ thuộc trong Angular 2. Ở đây bạn sẽ phải sử dụng các lớp.
jlang

Câu trả lời:


137

Giao diện chỉ ở thời gian biên dịch. Điều này chỉ cho phép bạn kiểm tra xem dữ liệu dự kiến ​​nhận được theo một cấu trúc cụ thể. Đối với điều này, bạn có thể truyền nội dung của bạn lên giao diện này:

this.http.get('...')
    .map(res => <Product[]>res.json());

Xem những câu hỏi sau:

Bạn có thể làm một cái gì đó tương tự với lớp nhưng sự khác biệt chính với lớp là chúng có mặt trong thời gian chạy (hàm tạo) và bạn có thể định nghĩa các phương thức trong chúng bằng cách xử lý. Nhưng, trong trường hợp này, bạn cần khởi tạo các đối tượng để có thể sử dụng chúng:

this.http.get('...')
    .map(res => {
      var data = res.json();
      return data.map(d => {
        return new Product(d.productNumber,
          d.productName, d.productDescription);
      });
    });

27
Cảm ơn câu trả lời chi tiết của bạn. Nếu giao diện chỉ được sử dụng tại thời gian biên dịch, làm thế nào trình biên dịch có thể kiểm tra cấu trúc của tệp JSON mà không thực sự kiểm tra http get? Nếu không thể, thì điểm quan trọng của giao diện là gì?
I_LIKE_FOO

7
@I_LIKE_FOO trình biên dịch không cần kiểm tra cuộc gọi nhận. Nó chỉ quan tâm đến việc kiểm tra các loại mà nó biết và chúng được căn chỉnh chính xác. var data = res.json();thực sự var data: any = res.json();là trình biên dịch nên chúng ta mất tất cả các kiểu kiểm tra data. Điều gì sẽ là hữu ích hơn đây sẽ là một cái gì đó giống như var data: ProductDto[] = res.json();với ProductDtolà một giao diện cho mô hình cấu trúc dữ liệu trong json trả lại.
GFoley83

3
Xem thêm: Angular style guide says not to use interfaces.Always use classes.Xem angular.io/guide/styleguide#style-03-03
Sampath

4
Vâng, nhưng vấn đề là họ không phải là những vị thần guru đã thiết kế typcript. Đó sẽ là Microsoft và công ty. Họ có xu hướng ủng hộ các giao diện, và các lớp khi thích hợp. Ngoài ra điểm thưởng ... một là thời gian chạy và khác là vào thời gian biên dịch
Tom Stickel

11
@Sampath Có lẽ hướng dẫn kiểu Angular đã được cập nhật khi tôi thấy điều này "Cân nhắc sử dụng giao diện cho các mô hình dữ liệu." Ngụ ý thích giao diện hơn lớp cho các mô hình dữ liệu.
Mikezx6r

40

Các giao diện mô tả hoặc là một hợp đồng cho một lớp hoặc một mới loại . Nó là một phần tử typecript thuần túy, vì vậy nó không ảnh hưởng đến Javascript.

Một mô hình, và cụ thể là một lớp , là một hàm JS thực tế đang được sử dụng để tạo các đối tượng mới.

Tôi muốn tải dữ liệu JSON từ một URL và liên kết với Giao diện / Mô hình.

Đi cho một mô hình, nếu không nó sẽ vẫn là JSON trong Javascript của bạn.


4

Như @ThierryTemplier đã nói để nhận dữ liệu từ máy chủ và cũng truyền mô hình giữa các thành phần (để giữ danh sách intellisense và gây ra lỗi thời gian thiết kế), tôi sử dụng giao diện nhưng tôi nghĩ nên gửi dữ liệu đến máy chủ (DTOs) lợi thế của tự động ánh xạ DTO từ mô hình.


-22

Sử dụng Class thay vì Giao diện là những gì tôi đã khám phá sau tất cả các nghiên cứu của mình.

Tại sao? Một lớp một mình là ít mã hơn một giao diện lớp cộng. (dù sao bạn có thể yêu cầu Class cho mô hình dữ liệu)

Tại sao? Một lớp có thể hoạt động như một giao diện (sử dụng thực hiện thay vì mở rộng).

Tại sao? Một lớp giao diện có thể là mã thông báo tra cứu nhà cung cấp trong phép tiêm phụ thuộc Angular.

từ Hướng dẫn phong cách góc cạnh

Về cơ bản, một Class có thể làm tất cả, giao diện sẽ làm gì. Vì vậy, có thể không bao giờ cần phải sử dụng một Giao diện .


10
Hướng dẫn phong cách Angular hiện đang thực sự nói, xem xét việc sử dụng giao diện cho các mô hình dữ liệu.
Alex Peters

@AlexPeter Vui lòng cung cấp bất kỳ liên kết xác thực. Cảm ơn trước
Anand Phadke

@AnandPhadke chắc chắn, đây là một liên kết Wayback Machine với Hướng dẫn phong cách góc từ khoảng thời gian nhận xét của tôi ở trên.
Alex Peters
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.