interface
表示你只想描述一个物体的形状.接口永远不会生成代码——它们只是类型系统中的一个工件.根据类是否有implements
子句,您将看到它的代码生成没有什么不同.
declare class
是指当你想要描述一个existing类(通常是一个TypeScript类,但并不总是)的时候,这个类将在外部出现(例如,你有两个.ts文件,可以编译成两个.js文件,这两个文件都通过script
个标签包含在一个网页中).如果您使用extends
从class
继承(无论基类型是declare class
还是常规class
),编译器将生成连接原型链和转发构造函数的所有代码.
如果您试图从本应是接口的declare class
继承,则会出现运行时错误,因为生成的代码将引用没有运行时显示的对象.
相反,如果你只是简单地创建了一个本应该是declare class
的接口,那么你就必须自己重新实现所有成员,而不会利用任何来自潜在基类的代码重用,并且在运行时判断原型链的函数会拒绝你的对象,因为它实际上不是基类的实例.
如果你有一个C++背景,你可以粗略地把interface
作为typedef
和declare class
,作为一个构造函数的extern
声明,这个构造函数在这个编译单元中严格地缺少定义.
从纯粹的消费Angular 来看(编写命令式代码,而不是添加新类型),interface
和declare class
之间的唯一区别在于不能创建接口.然而,如果你打算在一个新的class
中 Select extend
/implement
,你必须在interface
和declare class
之间正确 Select .其中只有一个能起作用.
两条规则对你很有用:
- 类型的名称是否与运行时实际存在的构造函数(例如
Date
是,但JQueryStatic
不是)对齐?如果是no,你肯定要interface
- 我是在处理另一个TypeScript文件中的编译类,还是足够类似的东西?如果是yes,使用
declare class