什么是TypeScript中的“接口结构类型”

时间:2012-10-04 05:08:24

标签: c# typescript structural-typing

在他关于TypeScript的blog post中,Mark Rendle说,他喜欢的一件事是:

  

“接口的结构类型。我真的希望C#可以做到这一点”

他的意思是什么?

2 个答案:

答案 0 :(得分:20)

基本上,这意味着接口在“鸭子打字”的基础上进行比较,而不是基于类型识别。

考虑以下C#代码:

interface X1 { string Name { get; } }
interface X2 { string Name { get; } }
// ... later
X1 a = null;
X2 b = a; // Compile error! X1 and X2 are not compatible

等效的TypeScript代码:

interface X1 { name: string; }
interface X2 { name: string; }
var a: X1 = null;
var b: X2 = a; // OK: X1 and X2 have the same members, so they are compatible

规范没有详细介绍这一点,但是类有“品牌”,这意味着相同的代码,用类而不是接口编写, 会出错。 C#接口确实有品牌,因此无法隐式转换。

考虑它的最简单方法是,如果您尝试从接口X转换到接口Y,如果X具有Y的所有成员,则转换成功,即使X和Y可能不具有相同的名称

答案 1 :(得分:2)

想一想。

class Employee { fire: = ..., otherMethod: = ...}
class Missile { fire: = ..., yetMoreMethod: = ...}
interface ICanFire { fire: = ...}
val e = new Employee
val m = new Missile
ICanFire bigGuy = if(util.Random.nextBoolean) e else m
bigGuy.fire

如果我们说:

interface IButtonEvent { fire: = ...}
interface IMouseButtonEvent { fire: = ...}
...

TypeScript将允许这样,C#不会。

由于TypeScript旨在与使用“松散”类型的DOM一起使用,因此它是打字稿唯一明智的选择。

我将它留给读者来决定他们是否喜欢“结构打字”......