【问题标题】:What is the use-case of enabling declaration and declarationMap in tsconfig.json?在 tsconfig.json 中启用声明和声明映射的用例是什么?
【发布时间】:2020-02-15 23:45:47
【问题描述】:

如果我们启用允许我们在浏览器上调试的源映射。同样寻找declaration和declarationMap的用例。

我已经在互联网上搜索过,但是我的糟糕除了生成.d.ts文件之外找不到实际的用例。

【问题讨论】:

    标签: typescript tsconfig


    【解决方案1】:

    生成.d.ts 文件正是declaration 编译器选项的用例,因此生成输出为.js,而所有类型定义仍可保留给使用您项目的其他TS 项目。

    IDE 可以利用declarationMap 选项来提供更好的开发人员体验:当您当前打开了相应的.d.ts 文件并希望查看其实现时,它使您能够快速导航到原始源(另请参阅this answer)。

    在 --declaration 旁边启用 --declarationMap 会导致编译器在输出 .d.ts 文件旁边发出 .d.ts.map 文件。语言服务现在也可以理解这些映射文件,并使用它们将基于声明文件的定义位置映射到其原始源(如果可用)。

    换句话说,对使用 --declarationMap 生成的 .d.ts 文件中的声明点击 go-to-definition 会将您带到定义该声明的源文件 (.ts) 位置,而不是.d.ts.

    【讨论】:

    • 真棒:) 明白了...我已经检查了添加一些包,如npm i faker。那时,我无法在我的 IDE 中找到类型定义。所以我添加了npm i @types/faker,它提供了一个 .d.ts 文件,以便在 IDE 中获得更好的开发人员体验。因此它只是为开发人员提供类型定义以及提供类型推断的 typescript 编译器。
    【解决方案2】:

    随着您的应用程序的增长,Typescript 对您的代码进行类型检查和编译的时间会越来越长。对于大型代码库,缓慢的编译时间会严重减慢您的开发速度。为了克服这个问题,从 Typescript 3.0 开始,您可以使用 Project References 将您的大项目拆分为较小的子项目。 declarationdeclarationMap 选项在这里发挥了重要作用。


    declaration 选项

    启用 declaration 选项将导致 Typescript 编译器创建声明文件 (.d.ts)。 .d.ts 文件包含在相应的.ts 文件中使用的类型的声明。它们不包含类型的实现,它们只包含可公开访问的类型声明。

    因此,任何人都可以在其他 Typescript 项目中使用您的 Typescript 项目中的类型。编译器可以借助您的 .d.ts 文件对其他项目中的代码进行类型检查,即使它们无权访问您的项目。

    当您将一个大项目拆分为多个较小的多个子项目时,这会有所帮助。子项目可以访问彼此的声明文件。当您的一个子项目(比如 B)依赖于另一个子项目(比如 A)中声明的类型时,编译器使用子项目 A 中的 .d.ts 文件对子项目 B 进行类型检查和编译无需再次编译子项目A。这可以加快大型项目的编译时间。


    declarationMap 选项

    启用declarationMap 选项时,Typescript 编译器会创建声明源映射 (.d.ts.map) 文件。声明源映射文件包含将.d.ts 文件中生成的每个类型声明链接回原始源文件 (.ts) 的映射定义。这些文件中的映射定义为 JSON 格式。

    这些由您的编辑器/IDE 使用。您将能够使用“转到定义”和重命名等编辑器功能来导航和编辑跨子项目的代码。这意味着,例如,如果您在一个子项目中重命名一个类型,则更改也会传播到其他子项目。


    请注意,即使您不拆分项目,也可以使用这些选项。如果您想为.d.ts 文件提供编辑器功能“转到定义”,这将非常有用。如果您在 .d.ts 文件的声明上点击“转到定义”,您将被带到源文件 (.ts) 位置,而不是 .d.ts 的位置。但这些选项在拆分项目中确实大放异彩。

    就是这样!希望对您有所帮助。

    如果您的项目包含超过 150 个文件左右,建议使用 Project References 将其拆分为较小的子项目。

    【讨论】:

    • 这对包裹的最终消费者有什么影响?例如,我应该将 declarationMap 映射保留在已发布的 NPM 包中,还是在这种情况下它们没有用?
    • @EricBurel,无需将它们与最终上线的代码一起发送。它们仅对开发人员有用。如果你正在编写一个库,你应该将它们放在一个单独的包中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    • 2011-06-01
    • 1970-01-01
    • 2011-01-27
    • 2018-12-19
    • 2019-03-19
    相关资源
    最近更新 更多