Tôi đang viết một dịch vụ cho ứng dụng góc 2 của mình bằng cách sử dụng TypeScript. Dịch vụ này sử dụng số ServiceWorker
của chrome để nghe thông báo đẩy (xem tutorial). Mã (javascript) tận dụng navigator
đầu tiên để xem nếu serviceWorker
được hỗ trợ, sau đó tiếp tục hoàn tất đăng ký, vv, nghĩa là,Định nghĩa kiểu TypeScript cho ServiceWorker
if ('serviceWorker' in navigator) {
console.log('Service Worker is supported');
navigator.serviceWorker.register('sw.js').then(function() {
return navigator.serviceWorker.ready;
}).then(function(reg) {
console.log('Service Worker is ready :^)', reg);
// TODO
}).catch(function(error) {
console.log('Service Worker error :^(', error);
});
}
Tôi muốn implemenet ở trên sử dụng nguyên cảo. Tuy nhiên, hiện tại lib.d.ts
được sử dụng bởi trình biên dịch TypeScript (xem bên dưới) dường như không có định nghĩa nào được xác định trên Navigator
cho serviceWorker
hoặc các phương pháp liên quan của nó chẳng hạn như serviceWorker.register
(Tôi đoán vì đó là triển khai cụ thể cho chrome).
interface Navigator extends Object, NavigatorID, NavigatorOnLine, NavigatorContentUtils, NavigatorStorageUtils, NavigatorGeolocation, MSNavigatorDoNotTrack, MSFileSaver, NavigatorUserMedia {
readonly appCodeName: string;
readonly cookieEnabled: boolean;
readonly language: string;
readonly maxTouchPoints: number;
readonly mimeTypes: MimeTypeArray;
readonly msManipulationViewsEnabled: boolean;
readonly msMaxTouchPoints: number;
readonly msPointerEnabled: boolean;
readonly plugins: PluginArray;
readonly pointerEnabled: boolean;
readonly webdriver: boolean;
getGamepads(): Gamepad[];
javaEnabled(): boolean;
msLaunchUri(uri: string, successCallback?: MSLaunchUriCallback, noHandlerCallback?: MSLaunchUriCallback): void;
requestMediaKeySystemAccess(keySystem: string, supportedConfigurations: MediaKeySystemConfiguration[]): PromiseLike<MediaKeySystemAccess>;
vibrate(pattern: number | number[]): boolean;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
Kết quả là tôi phải đối mặt với lỗi biên dịch vì trình biên dịch không thể tìm thấy loại serviceWorker
được liên kết. Do tôi mới sử dụng JavaScript và TypeScript, tôi đang cố gắng xác định cách tốt nhất để tiếp tục. Tôi hiểu các tùy chọn là:
- Giữ mã js và chỉ cần bỏ qua lỗi biên dịch (không phải lý tưởng).
- Giữ mã js và bằng cách nào đó loại bỏ các lỗi loại trong khi biên soạn .
- Tìm thư viện định nghĩa kiểu chữ hiện có mà có
serviceWorker
được xác định và bao gồm trong quá trình biên dịch. - Viết tập tin định nghĩa nguyên cảo của riêng mình cho hoa tiêu hoặc bằng cách nào đó mở rộng hiện
lib.d.ts
Sage tư vấn về lựa chọn tốt nhất đánh giá rất cao.
Cập nhật
Đã cố gắng để cast cho bất kỳ để loại bỏ lỗi biên dịch, tức là,
var nav = <any> navigator;
if ('serviceWorker' in nav) {
nav.serviceWorker.register('sw.js')
.then(function(reg) {
console.log('yey!', <any> reg);
}).catch(function(err) {
console.log('boo!', <any> err);
});
nhưng bây giờ phải đối mặt với lỗi mới, tức là,
error TS7006: Parameter 'reg' implicitly has an 'any' type.
error TS7006: Parameter 'error' implicitly has an 'any' type.
Ngoài ra, cám dỗ để viết định nghĩa cho ServiceWorker bằng cách sử dụng các details này. Tuy nhiên không bao giờ thực hiện nó trước, vì vậy sẽ cần một số thực hành!
Đúc sẽ là giải pháp đơn giản nhất, tuy nhiên, cố gắng truyền tới '' đưa ra lỗi 'TS7006: Tham số 'reg' ngầm có một loại 'bất kỳ'. - xem cập nhật. –