【问题标题】:How to import Typescript definition that exports a single variable如何导入导出单个变量的 Typescript 定义
【发布时间】:2019-02-12 03:32:07
【问题描述】:

“@types/dd-trace”中“dd-trace”库的类型定义导出单个变量。

declare var trace: TraceProxy;
export = trace;

declare class TraceProxy extends Tracer {
    /**
     * Initializes the tracer. This should be called before importing other libraries.
     */
    init(options?: TracerOptions): this;

    // A bunch of other irrelevant code.
}

如何在我的代码中导入它?如果我错误地尝试将 ddTrace.init() 分配给布尔值,TypeScript 会告诉我类型是“TraceProxy”。但是我已经尝试了所有看似的变化:

import { TraceProxy } from "dd-trace"

node_modules/@types/dd-trace"' has no exported member 'TraceProxy'. 失败

import { init, trace } from "dd-trace"

const tracer: trace = init()

在那里导入成功,但随后声明失败:3:15: cannot find name "trace"

所有这些变体都失败了:

const tracer: trace.trace = init()
const tracer: trace.TraceProxy = init()
const tracer: trace.Tracer = init()
const tracer: TraceProxy = init()
const tracer: Tracer = init()

导入模块失败:

import * as ddTrace from "dd-trace"

const tracer: ddTrace = ddTrace.init()

Cannot find name 'ddTrace'. 在第 3 行。

这些也失败了:

import * as ddTrace from "dd-trace"

const tracer: ddTrace.TraceProxy = ddTrace.init()

Cannot find namespace 'ddTrace'.

一个建议的答案(已删除)是:

import trace from "dd-trace"

const tracer: trace = trace.init()

这失败了:@types/dd-trace/index"' has no default export.

如何在此处声明类型定义?我正在使用最新版本的 TypeScript 并通过运行 ./node_modules/.bin/tsc myfile.ts 进行编译。

【问题讨论】:

    标签: typescript types datadog


    【解决方案1】:

    模块的导出实际上是跟踪器本身。调用tracer.init() 只是初始化跟踪器并返回自身。这意味着您不需要创建新变量。

    这应该可行:

    import * as ddTrace from "dd-trace";
    
    const tracer = ddTrace;
    tracer.init();
    
    // continue to use "tracer" for example "tracer.startSpan()" etc
    

    如果您使用我们的任何集成,还需要注意的重要一点是初始化应该在单独的文件中进行以避免提升。

    例如:

    // server.ts
    
    import tracer from "./tracer";
    import * as express from "express"; // or any other modules
    
    // tracer.ts
    
    import * as tracer from "dd-trace";
    
    tracer.init();
    
    export default tracer;
    

    这样做是为了确保在导入任何检测模块之前初始化跟踪器。

    如果您实际上并未在应用程序入口点中使用跟踪器,只需将 import tracer from "./tracer" 替换为 import "./tracer"

    【讨论】:

    • 谢谢!我假设您使用“我们的”这个词为 Datadog 工作?
    • 刚刚注意到赞成票,所以我假设它有效:)
    猜你喜欢
    • 2019-04-30
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    • 2017-07-07
    • 2017-09-14
    • 2019-06-03
    • 1970-01-01
    • 2021-06-05
    相关资源
    最近更新 更多