从结构上比较typescript对象类型

从结构上比较typescript对象类型,typescript,Typescript,从结构上比较对象类型。例如,在代码中 下面的片段,类“CPoint”与接口“Point”匹配,因为 “CPoint”具有“Point”的所有必需成员。一个班级可以 (可选)声明它实现了一个接口,以便 编译器将检查声明的结构兼容性。这个 示例还说明了对象类型可以与该类型匹配 从对象文字推断,只要对象文字 提供所有必需的成员 在他们的例子中,CPoint被认为是点类型,因为它是点类型,我可以在点的任何地方传递它。如果Point声明所有实现者都有方法Foo(x:string),CPoint就不会有该方

从结构上比较对象类型。例如,在代码中 下面的片段,类“CPoint”与接口“Point”匹配,因为 “CPoint”具有“Point”的所有必需成员。一个班级可以 (可选)声明它实现了一个接口,以便 编译器将检查声明的结构兼容性。这个 示例还说明了对象类型可以与该类型匹配 从对象文字推断,只要对象文字 提供所有必需的成员

在他们的例子中,
CPoint
被认为是
类型,因为它是
类型,我可以在
的任何地方传递它。如果
Point
声明所有实现者都有方法
Foo(x:string)
CPoint
就不会有该方法。因此,任何接受
并希望使用
Foo
的人,如果将
CPoint
传递给它,都会爆炸

我的问题是,我是否理解错了,如果不是,为什么这被认为是一个足够好的语言规范?

若Point声明所有的实现者都有方法Foo(x:string),CPoint就不会有那个方法。因此,任何接受一个点并希望使用Foo的人,如果将CPoint传递给它,都会崩溃

如果这样做,您将得到一个编译时错误,
CPoint
缺少
Foo
方法。我建议在打字练习场上试试

若Point声明所有的实现者都有方法Foo(x:string),CPoint就不会有那个方法。因此,任何接受一个点并希望使用Foo的人,如果将CPoint传递给它,都会崩溃


如果这样做,您将得到一个编译时错误,
CPoint
缺少
Foo
方法。我建议您在TypeScript平台上尝试一下。

您创建的类型定义/接口只是编译时的事情,在我看来,结构子类型是一个很好的特性

如果使用附加方法
Foo(x:string)
扩展
接口,则会告诉编译器,每个想要成为
的对象现在也需要此方法。在我看来,这正是你想要的,因为你可以发现所有你经过的地方,没有这些附加属性的物体

在将这种方法添加到接口之前,最好问问自己,是否每个具有
特征的对象都真的需要这种方法。根据我的经验,最好引入更多的接口,例如
Fooable
,并在需要对象时使用该接口,该对象需要使用
Foo
方法

如果有一个方法确实需要同时具有特征(x,y)和Foo的对象,则可以执行以下操作:

function myMethodRequiringASpecialObject(x: Point & Fooable) {}

这称为“交叉点类型”。请参阅此处的更多信息:

创建的类型定义/接口只是编译时的事情,在我看来,结构子类型是一个很好的特性

如果使用附加方法
Foo(x:string)
扩展
接口,则会告诉编译器,每个想要成为
的对象现在也需要此方法。在我看来,这正是你想要的,因为你可以发现所有你经过的地方,没有这些附加属性的物体

在将这种方法添加到接口之前,最好问问自己,是否每个具有
特征的对象都真的需要这种方法。根据我的经验,最好引入更多的接口,例如
Fooable
,并在需要对象时使用该接口,该对象需要使用
Foo
方法

如果有一个方法确实需要同时具有特征(x,y)和Foo的对象,则可以执行以下操作:

function myMethodRequiringASpecialObject(x: Point & Fooable) {}
这称为“交叉点类型”。请参阅此处的更多信息: