Typescript的Interface中为何可以定义property?这样做的意义何在?

之前回答了一个问题 https://segmentfault.com/q/10...

出于对其它面向对象强类型语言比如java,actionscript3中interface的经验,我回答了一句

一般接口只放方法(函数),不会定义属性

结果答案就被踩了,后来查了TS的文档发现,TS的interface确实可以定义property

这里我就有点困惑了,因为以前写别的强类型面向对象语言,interface一般都是用来描述高度抽象的行为所以一般情况下只定义方法(即使在语法上可以在interface中定义property,一般也不会这么去做),而property一般都是定义在class这个层面的。

由于没有系统学习过ts(基本就靠以前其它的语言经验拿来就上手了),所以这里请大家给我说说,ts这样设计的意义何在?如果要定义property为何不能用class代替呢?或者说我们在实际开发过程中是不是也应该规避在interface里定义property呢?

阅读 5.1k
2 个回答

typescript只是在编译器进行静态类型检查的弱类型语言,而不是一个强类型语言

简单说一个点
当我们只是需要在约束一个对象的结构时,使用interface在编译为js后,不会产生额外的信息,interface在编译为js后会被擦除;而如果使用class(包括abstract class),则会产生一个额外的对象,而实际上我们只是需要类型检查,这个对象就是无用的

关于TypeScript Team对于interface的定位,也许可以参考这篇blog:Walkthrough: Interfaces

这个interface其实约束的是一个duck typing的 而不是 class

JS里的method也只是property的一种,概念和语法都统一,仅仅是类型是函数,并有this绑定等微小不同。
考虑到getter等东西,甚至看上去非函数的property也可能里面有个函数。那么非函数property并不比method "更不抽象"。

所以我觉得专门做出一种不能 (非函数property) 的interface意义有限。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
logo
Microsoft
子站问答
访问
宣传栏