Я пишу службу для своего приложения с угловым 2, используя TypeScript. Сервис использует хром ServiceWorker
для прослушивания push-уведомлений (см. tutorial). Код (JavaScript) использует navigator
первых, чтобы увидеть, если serviceWorker
поддерживается, то продолжает завершать регистрацию и т.д., т.е.Определения типа TypeScript для 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);
});
}
Я хотел бы implemenet выше с помощью машинописи. Однако текущий lib.d.ts
, используемый компилятором TypeScript (см. Ниже), по-видимому, не имеет определений, определенных в Navigator
, для serviceWorker
или связанных с ним методов, таких как serviceWorker.register
(я предполагаю, что это реализация, специфичная для хрома).
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
Sage советы по самому лучшему варианту весьма признателен.
Update
Пытался бросить любому удалить ошибки компиляции, т.е.
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.
Кроме того, соблазн написать определения для ServiceWorker, используя эти details. Однако никогда не делал этого раньше, так что потребуется какая-то практика!
Кастинг был бы самым простым решением, однако попытка наложить на '' дает ошибку 'TS7006: параметр 'reg' неявно имеет тип 'any'. - см. обновление. –