我见过类似这样的相关问题,但它们都假设类和接口的区别在于类可以实例化,而接口不能。然而,以@types/google.maps为例,例如:
declare namespace google.maps {
class Map extends google.maps.MVCObject {
constructor(mapDiv: HTMLElement, opts?: google.maps.MapOptions);
controls: google.maps.MVCArray<any>[];
data: google.maps.Data;
fitBounds(
bounds: google.maps.LatLngBounds|google.maps.LatLngBoundsLiteral,
padding?: number|google.maps.Padding): void;
// ...
}
}
declare namespace google.maps {
interface MapType {
alt: string|null;
getTile(
tileCoord: google.maps.Point|null, zoom: number,
ownerDocument: Document|null): Element|null;
maxZoom: number;
minZoom: number;
name: string|null;
projection: google.maps.Projection|null;
radius: number;
releaseTile(tile: Element|null): void;
tileSize: google.maps.Size|null;
}
}
declare namespace google.maps {
interface MapTypeControlOptions {
mapTypeIds?: (string)[]|null;
position?: google.maps.ControlPosition|null;
style?: google.maps.MapTypeControlStyle|null;
}
}
declare namespace google.maps {
class MapTypeRegistry extends google.maps.MVCObject {
set(id: string, mapType: any): void;
}
}
declare namespace google.maps {
interface MapsEventListener {
remove(): void;
}
}
declare namespace google.maps {
interface WebglCameraParams extends google.maps.CameraParams {
lat: number;
lng: number;
}
}
接口和类:
在google maps代码中的某个地方,实际上有一个类用于这里定义的< code >类和这里定义的< code >接口。看起来类定义是用户可以实例化的,而不是库可以内部实例化的(接口)。
那么,在这些上下文中,接口和类之间更深层次的区别是什么?我明白另一个答案是什么,类通常是可构造的,但是这些类显然不是直接可实例化的。它们代表其他类。但是接口也代表其他类。所以我很困惑。
(来自您的评论):
我在问他们为什么把它们定义为类而不是接口。
< code>type 、< code>interface和< code>class之间有重叠(你很清楚这一点,但我必须从某个地方开始:-)),但是< code>class做三件事,而不只是< code>interface或< code>type会做的一件事。让我们看一个更简单的例子:
declare namespace example1 {
class Example1 {
a: string;
constructor(a: string);
static method(): void;
}
}
那:
Example1
。Example1
,该绑定引用这些实例的构造函数。(它不会创建绑定,它只是说有一个绑定。类型示例 1
),该类型是构造函数的类型。如果您想在没有class
的情况下编写相同的东西,您必须自己编写这三个东西中的每一个,例如示例2
here:
declare namespace example2 {
// Define the type for instances
interface Example2 {
a: string;
}
// Define that there is a binding for the constructor function
let Example2: { //
new (a: string): Example2; // Define the type for the constructor function
method(): void; //
}; //
}
您甚至可以更进一步,为构造函数声明一个命名类型:
declare namespace example3 {
// Define the type for instances
interface Example3 {
a: string;
}
// Define the type for the constructor function
interface Example3Constructor {
new (a: string): Example3;
method(): void;
}
// Define that there is a binding for the constructor function
let Example3: Example3Constructor;
}
(这就是<code>lib.es5.d.ts</code>所做的,比如<code>数组</code>,除了它使用<code>var</code>而不是<code>let</code>。)
和往常一样,当有不止一种方法做某事时,有些人会用一种方法做,有些人会用另一种方法做,但是当class
同时描述你试图描述的所有部分时,使用它有一些论点。
-或者- 或者我应该以目前相同的模块方式设置它们?我正在尝试,但它总是给我错误,不知道如何在没有类的模块中!
TypeScript中的这些语句(与)之间有什么区别?
这些语句(接口vs类型)有什么区别?
我最近遇到了这个问题,我不确定是使用接口还是类来定义特定的类型。 注意:这个问题不是问和之间的区别。 例如,给定这个类和接口 我将使用类或接口作为函数参数中的类型。 在我看来,两者都可以,但我更喜欢使用类来避免同步接口上的所有方法/属性。我认为接口只是一个类必须遵守的模板/契约。 但是,在我的例子中,大多数情况下,该类通常会添加更多不在接口定义中的方法/属性。 下面这个类就是一个很好的例子。 在这
这个问题直接类似于使用TypeScript进行类类型检查