【问题标题】:Why is `declare` word used in the `d.ts` files为什么在`d.ts`文件中使用`declare`词
【发布时间】:2017-06-04 14:41:11
【问题描述】:

每当tsc 生成d.ts 文件时,它都会在其中包含declare 字样,如下所示:

export declare class Moment {
    name: string;
}

现在,ts 文件中的declare 用于告诉tsc,不应该为declare 的类型生成js。所以它在ts 文件中是有意义的。但是,js 无论如何都不会从 d.ts 文件中生成,为什么要在那里使用这个词?

我试图从上面的代码中删除declare这个词:

export class Moment {
    name: string;
}

它的工作原理是一样的。

我找到了以下here:

如果文件具有扩展名 .d.ts,则每个根级别定义必须 将 declare 关键字作为前缀。这有助于明确 作者认为 TypeScript 不会发出任何代码。这 作者需要确保声明的项目在运行时存在。

那么它是d.ts 文件中declare 的唯一用途吗?

请注意,这与this one 不是同一个问题,因为我的问题是关于在d.ts 文件中使用declare,而不是ts 文件。

【问题讨论】:

    标签: typescript


    【解决方案1】:

    “.d.ts”文件和“.ts”都由同一个转译器处理。和关键字含义是一样的。根据documentation和article:

    declare 关键字用于您想要的环境声明 定义一个可能不是源自 TypeScript 文件的变量。

    declare 关键字使转译器不产生任何真正的 JavaScript 代码,并允许在其他 TypeScript 文件中使用“已声明”的对象。

    【讨论】:

    • 这没有意义,因为.d.ts文件从不产生任何JS代码——它是一个“类型”文件,仅用于通知编译器形状的类型。 .d.ts 不能包含实现,所以 declare 在那里是多余的。
    【解决方案2】:

    这很简单。
    当你想导出变量或函数的声明时,你有两种方法:

    1. 您可以在一行中创建一个变量或一个函数,然后您可以在新的一行中导出它。
      为此,您需要首先“声明”变量或函数,然后才能将其导出。
      例如:

    declare class Moment {
        name: string;
    }
    
    export Moment;
    1. 您可以在一行中导出它而无需先声明它。 例如:

    export class Moment {
        name: string;
    }

    【讨论】:

      猜你喜欢
      • 2020-12-04
      • 2018-11-01
      • 2015-07-04
      • 1970-01-01
      • 2016-05-03
      • 2013-11-13
      • 2020-10-12
      • 2021-03-11
      • 2020-09-05
      相关资源
      最近更新 更多