ServiceWorker代码[2345][object]上的TypeScript错误

ServiceWorker代码[2345][object]上的TypeScript错误,typescript,service-worker,Typescript,Service Worker,我正在用TypeScript(2.4.2)编写一个服务人员激活事件处理程序,它看起来像: function activate(event: ExtendableEvent) { event.waitUntil( caches.keys().then(function(cacheNames: Array<string>) { return Promise.all( cacheNames.map(function(cacheName: string

我正在用TypeScript(2.4.2)编写一个服务人员
激活
事件处理程序,它看起来像:

function activate(event: ExtendableEvent) {
  event.waitUntil(
    caches.keys().then(function(cacheNames: Array<string>) {
      return Promise.all(
        cacheNames.map(function(cacheName: string) {
          if (!OFFLINE_CACHE_REGEX.test(cacheName)) {
            return;
          }
          if (OFFLINE_CACHE_NAME !== cacheName) {
            return caches.delete(cacheName);
          }
        })
      );
    })
  );
}
功能激活(事件:ExtendableEvent){
event.waitill(
caches.keys().then(函数(cacheNames:Array){
回报你的承诺(
map(函数(cacheName:string){
如果(!OFFLINE_CACHE_REGEX.test(cacheName)){
返回;
}
如果(脱机\u缓存\u名称!==缓存名称){
返回缓存。删除(缓存名称);
}
})
);
})
);
}
这种方法的灵感来自杰克·阿奇博尔德的

问题是,TypeScript编译器抛出了一个错误,结果表明:

../file.ts的路径:40:[2345][object]'

其中,上述代码中的第40行指向
退货承诺.all(

虽然我可以猜到错误代码是TS2345,但我无法真正理解这意味着什么,因为我只有一个
[object]


任何指针都会非常有帮助!

您正在更改cacheNames数组的类型,因为您在第一个if语句中省略了返回值。这将返回未定义的值,因此数组不再仅由字符串组成。将返回值更改为cacheName或空字符串,您就可以了。

您确定您的cacheNamesrray是一个数组,而不是一个对象?这也是我的第一直觉。我说它确实应该是一个数组。另外,快速检查
cacheNames instanceof array
返回
true
。我还缺少什么?谢谢。我刚才才意识到这一点,并修改了我的代码,使用了
过滤器
映射到r>的组合删除未定义的项并消除错误。啊,这也是一个很好的解决方案。很高兴它现在已经排序了!:)