【发布时间】:2016-07-03 17:20:02
【问题描述】:
我正在使用 TypeScript 为我的 angular 2 应用程序编写服务。该服务使用 chrome 的 ServiceWorker 来监听推送通知(参见 tutorial)。代码(javascript)首先使用navigator查看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);
});
}
我想使用 TypeScript 来实现上述内容。但是,TypeScript 编译器(见下文)使用的当前lib.d.ts 似乎没有在Navigator 上为serviceWorker 或其相关方法(例如serviceWorker.register)定义定义(我猜是因为它是特定于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;
}
结果是我面临编译错误,因为编译器找不到关联的serviceWorker 类型。鉴于我是 JavaScript 和 TypeScript 的新手,我正在尝试确定最好的方法。我理解的选项是:
- 保留js代码,直接忽略编译错误(不 理想的)。
- 保留js代码并以某种方式抑制类型错误 汇编。
- 查找现有的打字稿定义库
已定义
serviceWorker并在编译期间包含它。 - 为导航器或以某种方式编写我自己的打字稿定义文件
扩展现有的
lib.d.ts
非常感谢您对最佳选择的明智建议。
更新
尝试强制转换为 any 以消除编译错误,即,
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);
});
但现在面临新的错误,即,
error TS7006: Parameter 'reg' implicitly has an 'any' type.
error TS7006: Parameter 'error' implicitly has an 'any' type.
此外,很想使用这些details 为 ServiceWorker 编写定义。但是以前从未做过,所以需要一些练习!
【问题讨论】:
标签: javascript typescript angular service-worker