当前位置: 首页 > 知识库问答 >
问题:

TypeScript 中的“声明类”和“接口”有什么区别

闻人飞白
2023-03-14

在TypeScript中,当创建.d.ts源代码声明文件时,哪个更可取,为什么?

declare class Example {
    public Method(): void; 
}

interface Example {
    Method(): void;
}

我能说出的区别是接口不能有静态方法,所以你必须为此使用一个类。两者都不产生任何JS输出,所以也许没关系?

共有3个答案

岳均
2023-03-14

通俗地说,< code>declare用于< code >。ts/d.ts文件告诉编译器,我们应该期望我们< code >声明的关键字存在于该环境中,即使它没有在当前文件中定义。这将允许我们在使用声明的对象时具有类型安全性,因为Typescript编译器现在知道一些其他组件可能会提供该变量。

吕皓
2023-03-14

您可以实现接口:

class MyClass implements Example {
    Method() {

    }
}

而<code>declare class</code>语法实际上是用来为非TypeScript编写的外部代码添加类型定义的,因此实现是“其他地方”。

马华茂
2023-03-14

< code>interface用于当您只想描述对象的形状时。从来没有为接口生成代码——它们只是类型系统中的一个工件。无论一个类是否有< code>implements子句,您都不会发现该类的代码生成有什么不同。

声明类适用于当您想要描述将在外部存在的现有类(通常是 TypeScript 类,但并非总是如此)时(例如,您有两个编译为两个.js文件的 .ts 文件,并且两者都通过网页中的脚本标记包含在内)。如果使用扩展从类继承(无论基类型是声明类还是常规),编译器将生成所有代码以挂接原型链和转发构造函数等等。

如果您试图从应该是接口< code >声明类继承,您将会遇到运行时错误,因为生成的代码将引用没有运行时表现形式的对象。

相反,如果您只需要<code>实现</code>一个本应是<code>声明类</code〕的接口,那么您将不得不自己重新实现所有成员,而不会利用来自潜在基类的任何代码重用,并且在运行时检查原型链的函数将拒绝您的对象,因为它实际上不是基类的实例

如果你有C背景,你可以粗略地将接口想象成typedef,并将声明想象成构造函数的extern声明,该构造函数在此编译单元中严格缺乏定义。

从纯消费方面(编写命令式代码,而不是添加新类型),接口声明类之间的唯一区别是您不能new一个接口。但是,如果您打算扩展/在一个新的中实现其中一种类型,您绝对必须在接口声明类之间正确选择。它们中只有一个可以工作。

两条规则将很好地为您服务:

  • 类型的名称是否与运行时实际存在的构造函数(可通过new调用的东西)对齐(例如Date是,但JQuerySt的不是)?如果没有,您肯定想要接口
  • 我是在处理来自另一个TypeScript文件的编译类,还是足够相似的东西?如果是,请使用声明类
 类似资料:
  • 我发现他们有同样的限制。 正如我所发现的,这两者之间没有明显的区别,因为它们都实施了相同的限制。我唯一注意到的是继承和实现。 类只能扩展到单个基类 一个类可以实现多个接口。

  • 我需要为对后端服务器的HTTP请求创建某种类型(使用Angular 2),例如:}, 我应该用什么来构建这些模型?谢谢!

  • 我正在使用typescript,无法使用其他文件中声明的接口 我的看起来像这样。 下面是tsconfig.json 目录结构如下所示 在< code>common.ts文件中使用它

  • 问题内容: 我对这两个词感到非常困惑。我检查了stackoverflow,对于C ++有一个类似的问题,但对于Java没有。 有人可以解释一下Java的两个术语之间的区别吗? 问题答案: 概念上的区别很简单: 声明 :您 声明的 是某些东西,例如类,函数或变量。你不说任何事情 什么 是类或函数的样子,你刚才说,它的存在。 定义 :您 定义 某种事物的实现方式,例如类,函数或变量,即您说的 是 实际

  • d.ts文件有两种运行模式: (1)d.ts文件中包含顶层import/export 就是模块运行模式 (2)d.ts文件中不包含 import/export 就是脚本运行模式 对于下面的代码 问题 1.d.ts文件中的 属性 使用declare声明和不适用declare声明有什么区别? 我自己试了下不管有没有declare,其他ts文件中都能正常引用到。 模块模式和脚本模式下 使用declare