在TypeScript中,当创建.d.ts源代码声明文件时,哪个更可取,为什么?
declare class Example {
public Method(): void;
}
或
interface Example {
Method(): void;
}
我能说出的区别是接口不能有静态方法,所以你必须为此使用一个类。两者都不产生任何JS输出,所以也许没关系?
通俗地说,< code>declare用于< code >。ts/d.ts
文件告诉编译器,我们应该期望我们< code >声明的关键字存在于该环境中,即使它没有在当前文件中定义。这将允许我们在使用声明的对象时具有类型安全性,因为Typescript编译器现在知道一些其他组件可能会提供该变量。
您可以实现接口:
class MyClass implements Example {
Method() {
}
}
而<code>declare class</code>语法实际上是用来为非TypeScript编写的外部代码添加类型定义的,因此实现是“其他地方”。
< code>interface用于当您只想描述对象的形状时。从来没有为接口生成代码——它们只是类型系统中的一个工件。无论一个类是否有< code>implements子句,您都不会发现该类的代码生成有什么不同。
声明
类适用于当您想要描述将在外部存在的现有类(通常是 TypeScript 类,但并非总是如此)时(例如,您有两个编译为两个.js文件的 .ts 文件,并且两者都通过网页中的脚本
标记包含在内)。如果使用扩展
从类继承(无论基类型是声明
类还是常规类
),编译器将生成所有代码以挂接原型链和转发构造函数等等。
如果您试图从应该是接口< code >声明类继承,您将会遇到运行时错误,因为生成的代码将引用没有运行时表现形式的对象。
相反,如果您只需要<code>实现</code>一个本应是<code>声明类</code〕的接口,那么您将不得不自己重新实现所有成员,而不会利用来自潜在基类的任何代码重用,并且在运行时检查原型链的函数将拒绝您的对象,因为它实际上不是基类的实例。
如果你有C背景,你可以粗略地将接口
想象成typedef
,并将声明类
想象成构造函数的extern
声明,该构造函数在此编译单元中严格缺乏定义。
从纯消费方面(编写命令式代码,而不是添加新类型),接口
和声明类
之间的唯一区别是您不能new
一个接口。但是,如果您打算扩展
/在一个新的
其中一种类型,您绝对必须在类
中实现接口
和声明类
之间正确选择。它们中只有一个可以工作。
两条规则将很好地为您服务:
new
调用的东西)对齐(例如Date
是,但JQuerySt的
不是)?如果没有,您肯定想要接口
声明类
我发现他们有同样的限制。 正如我所发现的,这两者之间没有明显的区别,因为它们都实施了相同的限制。我唯一注意到的是继承和实现。 类只能扩展到单个基类 一个类可以实现多个接口。
我需要为对后端服务器的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