打字稿中*.d.ts与*.ts有什么区别?

Nur*_*ony 42 typescript typescript1.4

我开始玩TypeScript,我发现它非常棒.但我感到困惑的区别*.d.ts*.ts.他们之间有什么区别?任何人都可以用适当的例子来解释我吗?

Dav*_*ret 47

TypeScript定义文件(*.d.ts)

这些文件用于描述在TypeScript中使用的JavaScript文件的"形状".

例如,假设我有以下JavaScript(Example.js):

function displayMessage(message) {
    alert(message);
}
Run Code Online (Sandbox Code Playgroud)

仅使用此文件,我的TypeScript代码就不会有任何线索存在此函数.它不会知道它的名字,也不会知道它的参数.我们可以通过在定义文件中描述它来解决这个问题(Example.d.ts):

declare function displayMessage(message: string);
Run Code Online (Sandbox Code Playgroud)

现在我可以displayMessage在没有编译错误的情况下使用TypeScript中的函数,并且当我错误地使用它时会遇到编译错误(例如,如果我提供2参数而不是1我会收到错误).

简而言之:定义文件允许您在TypeScript中使用现有的JavaScript代码,而无需在TypeScript中重写代码.

TypeScript文件(.ts)

这是您在编写TypeScript时使用的标准文件扩展名.它将被编译为JavaScript.

  • 我想改进答案:如果你定义**一个带有导出接口的文件**(不会输出任何js),你应该把它写在`.d.ts`文件中**.这样,在生成模块时,编译器将排除它. (3认同)
  • @Ciberman 这不一定是真的。如果始终使用“d.ts”文件,而其中只有类型而没有逻辑,则存在某些缺点和罪魁祸首。例如,从其中导入/导出。作为 TypeScript 讲师,我建议按照答案中所述进行操作:使用 d.ts 增强文件。这并不是说你的建议在任何方面都是_坏_,但实际上(例如IDE方面、配置方面)如果没有特定需要“d.ts”,那么拥有“.ts”文件并在那里导出类型会更容易 (3认同)

Dan*_*ker 24

*.d.ts文件中允许的任何内容也可能出现在*.ts文件中,但不会出现相反的情况.因此*.d.ts允许TypeScript功能的子集.

只允许*.d.ts文件包含不在输出中生成任何JavaScript代码的TypeScript代码.如果您尝试使用会生成JavaScript的TypeScript的任何功能,您将收到错误.

允许接口,因为它们在编译后完全消失.

与在输出JavaScript中生成对象的普通枚举不同,也允许使用常量枚举(在1.4中添加).

顶级类,变量,模块和函数必须以前缀为前缀declare.通常你会看到一个顶层declare module,因此它里面的东西也是纯粹的声明:

declare module Something {
    var x;
}
Run Code Online (Sandbox Code Playgroud)

它们不仅仅是将TypeScript接口暴露给用JavaScript编写的代码.您还可以使用它们来声明代码中广泛使用的一组公共接口,因此不需要require特定的物理模块来获得这些接口的可见性.