Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 什么';这两者之间的区别是什么;“声明类别”;及;接口“;打字_Javascript_Typescript - Fatal编程技术网

Javascript 什么';这两者之间的区别是什么;“声明类别”;及;接口“;打字

Javascript 什么';这两者之间的区别是什么;“声明类别”;及;接口“;打字,javascript,typescript,Javascript,Typescript,在TypeScript中,在创建.d.ts源声明文件时,哪一个更可取,为什么 declare class Example { public Method(): void; } 或 我可以看出的区别是接口不能有静态方法,因此必须使用类来实现。两者都不会产生任何JS输出,因此这也许无关紧要?您可以实现以下接口: class MyClass implements Example { Method() { } } interface test { foo: numbe

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

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


我可以看出的区别是接口不能有静态方法,因此必须使用类来实现。两者都不会产生任何JS输出,因此这也许无关紧要?

您可以实现以下接口:

class MyClass implements Example {
    Method() {

    }
}
interface test {
  foo: number,
  bar: string,
}

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

接口
仅用于描述对象的形状。接口永远不会生成代码——它们只是类型系统中的一个工件。根据类是否具有
implements
子句,您将不会看到类的代码生成有什么不同

declare class
用于描述将在外部出现的现有类(通常是TypeScript类,但并不总是如此)(例如,您有两个.ts文件,可编译为两个.js文件,并且这两个文件都通过
script
标记包含在网页中)。如果您使用
extends
类继承(无论基类型是
declare class
还是常规的
class
),编译器将生成连接原型链和转发构造函数的所有代码

如果试图从本应为接口的
声明类
继承,则会出现运行时错误,因为生成的代码将引用没有运行时显示的对象

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

为了获得真正的NoDy,如果你有C++背景,你可以粗略地考虑<代码>接口作为<代码> TyPufF和<代码>声明类< /COD>作为编译程序中严格缺少定义的构造函数的<代码> ExtNe>/Cuffic声明。 从纯消费的角度来看(编写命令式代码,而不是添加新类型),

interface
declare class
之间的唯一区别是不能
new
接口。但是,如果您打算在新的
类中
扩展
/
实现
其中一种类型,则必须在
接口
声明类
之间正确选择。其中只有一个能起作用

两条规则对您很有用:

  • 类型的名称是否与运行时实际存在的构造函数(可以通过
    new
    调用)对齐(例如
    Date
    是,但
    JQueryStatic
    不是)?如果没有,您肯定需要
    接口
  • 我是在处理另一个TypeScript文件中的编译类,还是其他足够类似的东西?如果是,请使用
    声明类

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

TS中
declare
interface
之间的差异: 声明:

declare class Example {
    public Method(): void; 
}
interface Example {
    Method(): void;
}
在上面的代码
declare
中,让TS编译器知道类
Example
在某个地方被声明。这并不意味着该类被神奇地包含在内。作为程序员,您有责任在声明类时使其可用(使用
declare
关键字)

界面:

declare class Example {
    public Method(): void; 
}
interface Example {
    Method(): void;
}
接口
是仅存在于typescript中的虚拟构造。typescript编译器仅将其用于类型检查。当代码被编译成javascript时,整个结构将被剥离。typescript编译器使用接口来检查对象是否具有正确的结构

例如,当我们有以下界面时:

class MyClass implements Example {
    Method() {

    }
}
interface test {
  foo: number,
  bar: string,
}
我们定义的具有此接口类型的对象需要与接口完全匹配:

// perfect match has all the properties with the right types, TS compiler will not complain.
  const obj1: test = {   
    foo: 5,
    bar: 'hey',
  }

看,我觉得这两种方法都不能真正帮助您描述如何使用它们,因为它们都可以在没有JS输出的情况下完成相同的任务。简短:使用declare时,您必须确保类的实现在运行时存在,而不必使用接口。因此,您建议应该使用declare类描述不是用TypeScript编写的代码?我假设是这种情况,但在检入的jquery.d.ts文件中,JQueryStatic是一个由:declare var$:JQueryStatic实现的接口,我认为这是declare类${public static…}我能想到的唯一原因是如果你不想让人们扩展这个类-使用接口意味着你必须提供整个实现。这是有道理的。也许这就是原因。好吧,那么,我正试图指向另一个JS库中的声明,所以我肯定需要声明。代码在一些库函数(类)上使用了静态特性——到目前为止,我还没有看到声明文件中表示的静态特性或方法。哦,我应该使用名称空间还是模块?实际上,您可以在typescript中创建一个新接口。唯一的限制是继承。您不能在