TypeScript中如何指定API未导出的返回变量类型?(OpenTelemetry场景)
解决OpenTelemetry SDK中Meter类型未导出的问题
在使用TypeScript开发OpenTelemetry SDK相关功能时,你可能会遇到Meter类型未被@opentelemetry/sdk-metrics导出,无法为成员变量或函数参数指定类型的问题,示例代码如下:
import { MeterProvider } from "@opentelemetry/sdk-metrics" class MyClass { private meter : Meter | undefined; // 无法指定Meter类型 private startup(provider : MeterProvider) { this.meter = provider.getMeter("my-meter"); } }
doStuffWithMeter(meter : Meter) { // 同样无法指定Meter类型 meter.doThings() // ... }
以下是几种可行的解决方法:
方法1:从@opentelemetry/api导入Meter类型
OpenTelemetry的架构设计中,核心接口与类型由@opentelemetry/api包定义,SDK包(如@opentelemetry/sdk-metrics)仅负责实现这些接口。因此你可以直接从API包导入Meter类型:
import { Meter } from "@opentelemetry/api"; import { MeterProvider } from "@opentelemetry/sdk-metrics"; class MyClass { private meter: Meter | undefined; private startup(provider: MeterProvider) { this.meter = provider.getMeter("my-meter"); } } function doStuffWithMeter(meter: Meter) { // 调用Meter的实际方法,示例:创建计数器 meter.createCounter("operation-count"); }
这是最规范的解决方案,因为API包是SDK的依赖项,你的项目中应该已经存在该依赖。
方法2:用TypeScript工具类型推导Meter类型
如果不想显式导入API包(不推荐,但可作为临时方案),可以使用ReturnType工具类型从MeterProvider.getMeter方法的返回值中推导类型:
import { MeterProvider } from "@opentelemetry/sdk-metrics" class MyClass { private meter: ReturnType<MeterProvider['getMeter']> | undefined; private startup(provider: MeterProvider) { this.meter = provider.getMeter("my-meter"); } } function doStuffWithMeter(meter: ReturnType<MeterProvider['getMeter']>) { meter.doThings(); }
ReturnType<MeterProvider['getMeter']>会自动获取getMeter方法返回的实例类型,等价于Meter接口。
方法3:使用模糊类型(不推荐)
如果暂时不需要严格的类型检查,可以用unknown或any作为临时替代,但这会丢失TypeScript的类型校验能力:
class MyClass { private meter: unknown | undefined; private startup(provider: MeterProvider) { this.meter = provider.getMeter("my-meter"); } }
内容的提问来源于stack exchange,提问作者Nu Nunu
相关产品推荐
相关产品推荐

