使用winston-azure-blob-transport时遇Property 'Azure'不存在于'Transports'类型错误
解决Winston Azure Blob Transport的TypeScript类型错误
我之前也碰到过这类TypeScript类型不兼容的问题,咱们一步步来搞定它:
这个错误的核心原因是——TypeScript默认不知道winston-azure-blob-transport给Winston的Transports对象新增了AzureBlob属性。要么是这个包没有提供对应的TypeScript类型定义,要么是类型定义没正确扩展Winston的内置类型。下面是几种可行的解决办法:
方法1:尝试安装官方类型定义(如果存在)
先看看社区有没有维护这个包的TypeScript类型,在终端运行:
npm install @types/winston-azure-blob-transport --save-dev # 用yarn的话就执行 yarn add @types/winston-azure-blob-transport --dev
安装完成后,重启你的TypeScript服务(比如VS Code里按Ctrl+Shift+P,选择"TypeScript: Restart TS Server"),看看错误是否消失。如果这个包没有官方类型,这条命令会失败,那就换方法2。
方法2:手动添加类型声明
如果没有现成的类型定义,我们可以自己写一个声明文件来扩展Winston的类型:
- 在项目根目录(或者
src文件夹下)创建一个名为winston-azure-blob-transport.d.ts的文件,内容如下:
import winston from 'winston'; import { AzureBlobTransportOptions } from 'winston-azure-blob-transport'; declare module 'winston' { interface Transports { AzureBlob: winston.TransportInstanceConstructor<AzureBlobTransportOptions>; } }
- 确保你的
tsconfig.json里包含了这个声明文件的路径,比如在include数组里加上:
"include": [ "./src/**/*", "./winston-azure-blob-transport.d.ts" ]
这样TypeScript就能识别winston.transports.AzureBlob这个属性了。
方法3:临时用类型断言绕过检查(不推荐长期使用)
如果你只是想快速跑通代码,不想折腾类型,可以用类型断言告诉TypeScript“我确定这个属性存在”:
修改后的代码如下:
var winston = require("winston"); require("winston-azure-blob-transport"); // 用类型断言跳过TS的类型检查 const AzureBlobTransport = (winston.transports as any).AzureBlob; var logger = new (winston.Logger)({ transports: [ new AzureBlobTransport({ account: { name: "Azure storage account sub domain ([A-Za-z0-9])", key: "The long Azure storage secret key" }, containerName: "A container name", blobName: "The name of the blob", level: "info" }) ] }); logger.warn("Hello!");
不过这种方法会丢失TypeScript的类型检查优势,建议只当临时方案用,优先考虑方法1或2。
内容的提问来源于stack exchange,提问作者Spandana Satyanarayana
相关产品推荐
相关产品推荐

