更新TypeScript到4.4.4后npm run build提示Navigator无msSaveOrOpenBlob属性如何解决
报错原因
msSaveOrOpenBlob是IE、旧版Edge专属的非标准浏览器API,TypeScript 4.4及以上版本的官方标准类型库中,已经从Navigator接口的定义里移除了该非标准属性的声明,因此编译时会抛出TS2339类型错误。
解决方案
可根据你的项目使用场景选择以下任意一种方案:
方案1:单次使用临时类型断言
仅在当前调用处绕过类型校验,适合仅用到1-2次该API的场景:
if ((navigator as any).msSaveOrOpenBlob) { (navigator as any).msSaveOrOpenBlob(blob, fileName); }
方案2:扩展全局Navigator类型(推荐)
在项目全局类型声明文件(通常为global.d.ts或typings.d.ts,需确保该文件在tsconfig.json的include配置范围内)中添加以下声明,全局生效:
interface Navigator { /** IE/旧Edge专属Blob导出API */ msSaveOrOpenBlob?: (blob: Blob, fileName?: string) => boolean; }
添加后原代码无需任何修改即可正常编译,还能保留该API的类型提示。
方案3:自定义类型守卫
不想使用any也不想修改全局声明时,可以用类型守卫实现类型收窄,完全符合TypeScript类型规范:
// 先定义类型守卫方法 function supportMsSaveBlob(nav: Navigator): nav is Navigator & { msSaveOrOpenBlob: (blob: Blob, fileName?: string) => boolean } { return 'msSaveOrOpenBlob' in nav; } // 调用处代码 if (supportMsSaveBlob(navigator)) { navigator.msSaveOrOpenBlob(blob, fileName); }
内容的提问来源于stack exchange,提问作者Nick Grava
相关产品推荐
相关产品推荐

