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?
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 –