2017-03-27 19 views
6

Tôi gặp một chút khó khăn khi tìm bất kỳ tài liệu rõ ràng hoặc giải thích cho mối quan hệ dường như đặc biệt giữa lớp TypeScript và giao diện có cùng tên.Mối quan hệ giữa một lớp TypeScript và một giao diện có cùng tên

  • Ý nghĩa của giao diện có cùng tên với lớp học là gì?
  • Tại sao một lớp chia sẻ tên của nó với giao diện tự động triển khai giao diện đó?
  • Tại sao trình biên dịch phàn nàn về việc triển khai getter của tôi trong trường giao diện chỉ đọc khi lớp và giao diện có cùng tên, nhưng chấp nhận việc triển khai nếu các tên khác nhau?
  • Có tài liệu chuẩn nào đề cập đến những câu hỏi này không?

Code:

// Co-named interface and class doesn't like readonly property implementation: 

interface Foo { 
    readonly x: number; // Error: Duplicate identifier 'x' 
    y: number; 
} 

class Foo { 
    get x(): number { // Error: Duplicate identifier 'x' 
    return 0; 
    } 

    y = 1; 
} 

// Same as above, but different class name + explicit `implements` 

class Bar implements Foo { 
    get x(): number { // No error! 
    return 0; 
    } 

    y = 1; 
} 

// Duplicating the first example, but explicitly implementing the co-named interface: 

interface Baz { 
    readonly x: number; // Error: Duplicate identifier 'x' 
    y: number; 
} 

class Baz implements Baz { 
    get x(): number { // Error: Duplicate identifier 'x' 
    return 0; 
    } 

    y = 1; 
} 

Trả lời

7

giao diện cùng tên trong một module will be merged:

interface Foo { 
    x: number; 
} 

interface Foo { 
    y: string; 
} 

let g = {} as Foo; 
g.x; // OK 
g.y; // OK 

Một khai báo lớp tạo both a constructor function as well as type declaration, trong đó chủ yếu có nghĩa là tất cả các lớp học có thể được sử dụng như giao diện.

class Bar { 
    y: number; 
} 

interface IBaz extends Bar { } // includes y: number 

class CBaz implements Bar { 
    y: number = 5; 
} 

Do đó, có một lớp và giao diện có cùng tên tương đương với hai giao diện có cùng tên và bạn sẽ nhận được xung đột hợp nhất nếu cả hai trường hợp này lại khai báo cùng một thành viên loại.

Thật kỳ lạ, nguyên cảo sẽ cho phép cho việc này:

export interface Foo { 
    readonly x: number; 
} 

export class Foo { 
    readonly x: number = 3; 
} 

nhưng nó sẽ không cho phép get x() { return 3; } mặc dù cả hai những tạo như readonly x: number, vì vậy tôi chỉ có thể tưởng tượng rằng các kiểm tra kiểu coi chúng như nhau trong hợp nhất ngay cả khi chúng giống nhau về ngữ nghĩa (đây là lý do tại sao bạn có thể mở rộng giao diện và chỉ định thuộc tính chỉ đọc như một hàm getter).

+0

Cảm ơn. Đã đăng một vấn đề để có được một số làm rõ về lý do tại sao trình biên dịch phàn nàn theo cách này: https://github.com/Microsoft/TypeScript/issues/14882 –

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