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

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

interface Example {
    Method(): void;
}

The differences that I can tell are that interfaces can't have static methods, so you must use a class f或 that. Both don't product any JS output, so perhaps it doesn't matter?

推荐答案

interface表示你只想描述一个物体的形状.接口永远不会生成代码——它们只是类型系统中的一个工件.根据类是否有implements子句,您将看到它的代码生成没有什么不同.

declare class是指当你想要描述一个existing类(通常是一个TypeScript类,但并不总是)的时候,这个类将在外部出现(例如,你有两个.ts文件,可以编译成两个.js文件,这两个文件都通过script个标签包含在一个网页中).如果您使用extendsclass继承(无论基类型是declare class还是常规class),编译器将生成连接原型链和转发构造函数的所有代码.

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

相反,如果你只是简单地创建了一个本应该是declare class的接口,那么你就必须自己重新实现所有成员,而不会利用任何来自潜在基类的代码重用,并且在运行时判断原型链的函数会拒绝你的对象,因为它实际上不是基类的实例.

如果你有一个C++背景,你可以粗略地把interface作为typedefdeclare class,作为一个构造函数的extern声明,这个构造函数在这个编译单元中严格地缺少定义.

从纯粹的消费Angular 来看(编写命令式代码,而不是添加新类型),interfacedeclare class之间的唯一区别在于不能创建接口.然而,如果你打算在一个新的class中 Select extend/implement,你必须在interfacedeclare class之间正确 Select .其中只有一个能起作用.

两条规则对你很有用:

  • 类型的名称是否与运行时实际存在的构造函数(例如Date是,但JQueryStatic不是)对齐?如果是no,你肯定要interface
  • 我是在处理另一个TypeScript文件中的编译类,还是足够类似的东西?如果是yes,使用declare class

Typescript相关问答推荐

如何使用TypScript限制允许对JavaScript值进行的操作集?

如何在方法中定义TypeScript返回类型,以根据参数化类型推断变量的存在?

使用Angular和API请求在CRUD操作后更新客户端数据的良好实践

有没有办法解决相互影响的路由之间的合并?

如何在单击停止录制按钮后停用摄像机?(使用React.js和Reaction-Media-Recorder)

类型{}上不存在属性&STORE&A;-MobX&A;REACT&A;TYPE脚本

当方法参数和返回类型不相互扩展时如何从类型脚本中的子类推断类型

TypeScrip界面属性依赖于以前的属性-针对多种可能情况的简明解决方案

如何判断对象是否有重叠的叶子并产生有用的错误消息

是否存在类型联合的替代方案,其中包括仅在某些替代方案中存在的可选属性?

在Reaction-Native-ReAnimated中不存在Animated.Value

ApexCharts条形图未显示最小值.负值

从对象类型描述生成类型

布局组件中的Angular 17命名路由出口

刷新页面时,TypeScrip Redux丢失状态

如何正确调用创建的类型?

如何从一个泛型类型推断多个类型

如何创建内部和外部组件都作为props 传入的包装器组件?

如何使用angular15取消选中位于其他组件中的复选框

使用本机 Promise 覆盖 WinJS Promise 作为 Chrome 扩展内容脚本?