新的 TypeScript 版本不包括“window.navigator.msSaveBlob”
Posted
技术标签:
【中文标题】新的 TypeScript 版本不包括“window.navigator.msSaveBlob”【英文标题】:New TypeScript version does not include 'window.navigator.msSaveBlob' 【发布时间】:2021-11-27 19:37:56 【问题描述】:我有一个 TypeScript 项目 (https://github.com/jmaister/excellentexport),它运行良好。
添加dependabot进程后,提示升级typescript:
Bump typescript from 4.3.4 to 4.4.3
但是,由于我维护的库对 Internet Explorer 的旧 Internet Explorer 属性的引用,它无法使用新版本构建。
这是构建错误的示例:
src/excellentexport.ts:143:30 - error TS2339: Property 'msSaveBlob' does not exist on type 'Navigator'.
143 if (window.navigator.msSaveBlob)
~~~~~~~~~~
src/excellentexport.ts:145:30 - error TS2339: Property 'msSaveBlob' does not exist on type 'Navigator'.
145 window.navigator.msSaveBlob(blob, filename);
~~~~~~~~~~
src/excellentexport.ts:278:34 - error TS2339: Property 'msSaveBlob' does not exist on type 'Navigator'.
我应该取消对旧 Internet Explorer 的支持吗?是继续使用那些 IE 特定属性的方法吗?
【问题讨论】:
我会删除对旧 IE 的支持。它们是人们需要更多理由放下的安全噩梦。如果做不到这一点,则不是 TypeScript 本身,而是与 TypeScript 捆绑在一起的 lib.d.ts 和相关文件导致了问题。见github.com/microsoft/TypeScript-DOM-lib-generator/issues/1029 您是否应该删除 IE 支持取决于您/您的公司是否愿意或必须支持它。 (理想情况下,每个人都会删除它。) 【参考方案1】:我最近遇到了完全相同的问题,我得到的解决方案是在 global
命名空间中扩展 Navigator
接口,因此它仍然包含 msSaveBlob
,基于 TypeScript 如何记录 msSaveBlob
这里:MSFileSaver
这是我使用的代码:
declare global
interface Navigator
msSaveBlob?: (blob: any, defaultName?: string) => boolean
if (navigator.msSaveBlob)
// use navigator.msSaveBlob
【讨论】:
我在哪里声明以及如何导入它? 希望您能够将它放在与使用msSaveBlob
相同的文件中,这就是我能够做到的。 TypeScript 对于这样的事情可以去哪里有点固执己见。据我了解,您必须在导入或导出某些内容的文件中使用它。如果不这样做,您将收到编译错误“错误 TS2669:全局范围的增强只能直接嵌套在外部模块或环境模块声明中。”
为我工作谢谢。我只是把它放在组件中的导入之后。【参考方案2】:
我在我的 appmodule.ts 文件中声明了全局命名空间,因为它在多个类似这样的文件中使用
declare global
interface Navigator
msSaveBlob:(blob: Blob,fileName:string) => boolean
调用文件看起来像这样**//它像你提到的那样抛出构建错误,
if (navigator.msSaveBlob)
// IE 10+
navigator.msSaveBlob(blob, fileName);
【讨论】:
以上是关于新的 TypeScript 版本不包括“window.navigator.msSaveBlob”的主要内容,如果未能解决你的问题,请参考以下文章