繁体   English   中英

环境命名空间打字稿示例

[英]Ambient Namespaces typescript example

命名空间”一章提供了一个与D3.d.ts相关的示例,我不理解。
这是完整的示例:

declare namespace D3 {
    export interface Selectors {
        select: {
            (selector: string): Selection;
            (element: EventTarget): Selection;
        };
    }

    export interface Event {
        x: number;
        y: number;
    }

    export interface Base extends Selectors {
        event: Event;
    }
}

declare var d3: D3.Base;

我真的不明白,我将如何在模块或打字稿脚本中使用D3.d.ts 请给我一些简短的例子。

编辑
请忽略以下事实:此处使用D3; 可能是B3或G3或X7 ...等等; 我对专门的图书馆不感兴趣。 我只对如何使用打字稿模块和打字稿脚本中给出的示例感兴趣。

EDIT2最令我困惑的是,上面的示例使用了声明名称空间...而不是名称空间D3 (例如用于名称空间Validation )。 另外, 声明var d3的用途是什么(以及如何使用?) :D3.Base;

这样的声明定义了不是来自导入的全局变量,而是可能由某些<script>window上定义的。 为了能够直接直接使用这些变量(无需导入!),您可以始终使用引用,例如:

/// <reference path="../types/D3.d.ts" />
d3.select("div"); // No import!

如果声明文件放置在@types目录中,则应包含该声明文件,而无需明确引用。


命名空间使用declare因为这是一个声明文件:它必须导出命名空间(仅对模块有效)或声明它,以使这些类型可用。

据我了解打字稿,示例中的“代码”不会生成或更改任何输出javascript。 正是所有声明将帮助智能感知和打字稿编译器发现错误,但无助于更改代码。 该示例给出的声明旨在用于“环境”声明文件,即为普通javascript库提供打字稿定义的声明文件,以便打字稿和智能感知可以像处理打字稿文件一样使用它们,而不是普通的javascript。 我相信,最初的近似打字稿会将其发现的,没有声明知识的任何内容都视为“任何”类型。

对于提到的库,最好使用现有的类型库( npm install --save-dev @types/d3 )。 我发现在安装库( npm install --save d3 )和@types/d3 ,在.ts文件中使用import * as d3 from 'd3' (角度5;其他情况下可能需要其他步骤)对象和类型信息,一切工作令人满意。 如果打开类型文件,将看到与打字稿文档示例中给出的声明完全不同的一组声明,但是我相信它们仍然都是声明,即没有代码。

回复编辑

示例中的文件不是主要的打字稿文件。 它是一个声明文件,描述了普通javascript库的“打字稿形状”,即,如果用打字稿编写普通的javascript,打字稿编译器和智能感知应该如何假装。 尽管您可能会认为名称D3的选择是任意的,但这并不是完全正确的。 .d.ts文件正在尝试为本身不提供该信息的库(d3库: https : .d.ts提供打字稿元信息(尽管如上所述,打字稿也是如此)该特定库的元信息可以通过@types包获得)。

如果您正在编写自己的库代码,并希望按照验证示例在名称空间中工作,则应使用namespace D3而不是declare namespace D3 ,但您还将编写.ts文件,而不是.d.ts文件。 。 正如文档的章节标题所述,该示例在环境名称空间上工作,即,文件编写者未(通常)提供的普通javascript代码的名称空间。

总而言之,文档两半的目标是不同的。 在上半部分,“验证”代码向您展示了如何在自己的打字稿代码中使用名称空间。 在下半部分,“ d3”代码向您展示如何为纯JavaScript而不是打字稿的代码提供打字稿元数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM