2015-06-21 24 views
14

Trong ví dụ của tôi, tôi đang cố gắng mở rộng giao diện TS Window để bao gồm một polyfill cho fetch. Tại sao không quan trọng. Câu hỏi đặt ra là "làm thế nào để tôi nói với TS rằng window.fetch là một chức năng hợp lệ?"Cách mở rộng giao diện kiểu chữ 'Cửa sổ'

tôi đang làm điều này trong VS Mã, v.0.3.0 mà đang chạy TS v.1.5 (IIRC).

tuyên bố giao diện bên trong tập tin lớp TS của tôi, nơi tôi muốn sử dụng nó không hoạt động:

///<reference path="typings/tsd.d.ts"/> 

interface Window { 
    fetch:(url: string, options?: {}) => Promise<any> 
} 
... 
window.fetch('/blah').then(...); // TS objects that window doesn't have fetch 

Nhưng đó là OK nếu tôi tuyên bố giao diện này tương tự trong một ".d.ts" riêng và tham khảo nó trong tệp lớp TS của tôi.

Đây là "typings/window.extend.d.ts"

///<reference path="es6-promise/es6-promise"/> 
interface Window { 
    fetch:(url: string, options?: {}) => Promise<any> 
} 

Bây giờ tôi có thể sử dụng nó trong TS tập tin lớp học của tôi:

///<reference path="typings/window.extend.d.ts"/> 
... 
window.fetch('/blah').then(...); // OK 

Ngoài ra, tôi có thể viết một giao diện mở rộng với một tên khác là trong tệp lớp TS của tôi và sau đó sử dụng nó trong một dàn diễn viên:

interface WindowX extends Window { 
    fetch:(url: string, options?: {}) => Promise<any> 
} 
... 
(<WindowX> window).fetch('/blah').then(...); // OK 

Tại sao việc mở rộng giao diện hoạt động trong "d.ts" nhưng không phải là tại chỗ?

Tôi có thực sự phải trải qua những vòng quay này không?

+0

Một câu hỏi làm rõ .... cách tốt nhất để đạt được mở rộng một giao diện là gì? Tôi thấy ưu và nhược điểm của cả hai số này –

Trả lời

10

Khi bạn có một cấp cao nhất import hoặc export trong tập tin của bạn (mà bạn phải nơi nào đó để được có vấn đề này), tập tin của bạn là một bên ngoài mô-đun.

Trong mô-đun bên ngoài, việc khai báo giao diện luôn tạo một loại mới thay vì tăng thêm giao diện toàn cầu hiện có. Điều này bắt chước hành vi chung của bộ nạp mô-đun - những thứ được khai báo trong tệp này không hợp nhất hoặc can thiệp vào mọi thứ trong phạm vi toàn cục.

Lý do cho phép hồi chuyển này là nếu không sẽ không có cách nào, trong mô-đun bên ngoài, hãy xác định các biến hoặc loại mới có cùng tên với các biến trong phạm vi toàn cục.

+0

Bạn có thể cung cấp liên kết đến một số tài liệu về vấn đề này không? Có lẽ cần phải mở rộng mục nhập wiki [Tuyên bố hợp nhất] (https://github.com/Microsoft/TypeScript/wiki/Declaration-Merging)? –

+0

I ** do ** có các câu lệnh 'import' cấp cao nhất. Những gì bạn nói có ý nghĩa bây giờ mà tôi hiểu. Nhưng tôi vẫn không biết những ưu/nhược điểm của hai cách tiếp cận đã làm việc hoặc nếu có một cách tốt hơn thứ 3.Tôi chắc chắn rằng mở rộng 'cửa sổ' sẽ là một kịch bản phổ biến cần được ghi rõ ràng. [Tuyên bố hợp nhất] (https://github.com/Microsoft/TypeScript/wiki/Declaration-Merging) chắc chắn cần được xây dựng ... đặc biệt là vì ví dụ 'giao diện tài liệu' sẽ không hoạt động trong trường hợp sử dụng của tôi *! – Ward

+3

Chúng tôi yêu thích cách đánh máy khi chúng chính xác. Chúng ta ghét chúng khi chúng không. Có một con đường sạch sẽ để mở rộng chúng là rất quan trọng. Id muốn biết các tùy chọn khác ở đây quá –

6

Bạn cần declare global

declare global { 
    interface Window { 
    fetch:(url: string, options?: {}) => Promise<any> 
    } 
} 

này hoạt động thì:

window.fetch('/blah').then(...); 
+0

Bạn đang sử dụng webpack? Đối với tôi, những thứ tôi khai báo trên toàn cầu trong một mô-đun không hiển thị trong các mô-đun khác. Bất kỳ đầu mối? – mayid

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