TypeScript中为何使用class而非interface?二者区别及适用场景是什么?
你认为interface在纯结构定义场景更易用的想法没有错误,只是需要注意:你提到的「两种方式最终得到的结果一致」是认知误区,二者运行时的本质完全不同,只有在仅做编译时类型校验的场景下表现一致。
核心区别
- 存在阶段不同:
interface是 TypeScript 专属的编译时类型语法,编译为 JavaScript 后会被完全删除,仅在编译阶段做类型校验,不会产生任何运行时代码;class是 JavaScript 原生支持的语法,编译后会保留为真实的构造函数,会占用运行时内存。 - 功能范围不同:
class支持编写属性声明、方法实现、构造函数初始化逻辑、私有/受保护成员、静态成员,还可以通过instanceof做运行时的实例类型判断;interface仅能描述对象的结构规则,不能包含任何实现逻辑,也无法在运行时被访问、做类型校验。 - 继承/扩展规则不同:
class可以通过extends继承其他类的实现逻辑,也可以通过implements遵循多个interface的结构约束;interface可以继承多个interface或class的结构,但仅能做结构合并,不能继承实现逻辑,且同名interface支持自动属性合并,class不支持同名合并。
适用场景
优先选择 interface
- 仅需要定义数据结构、做编译时类型约束,不需要生成实例、编写业务逻辑的场景,比如定义后端接口返回值格式、普通数据对象的结构,此时
interface没有运行时开销,写法更简洁。 - 需要利用同名类型自动合并特性的场景。
优先选择 class
- 需要批量创建同结构实例、且实例需要包含方法或初始化逻辑的场景,比如要给
Dog类添加bark()方法、实例创建时自动生成唯一ID,只能用class实现。 - 需要做运行时类型校验的场景:可以直接用
dog instanceof Dog判断对象是否为该类的实例,interface编译后不存在,无法实现该能力。 - 需要用到封装、继承、多态等面向对象特性的场景,比如私有属性保护、抽象类定义、复用父类实现逻辑等需求,只能用
class实现。
经验法则
- 纯数据类型约束优先用
interface,不要为了定义结构就写空构造函数的class,平白增加运行时代码体积。你举的示例场景恰好是interface的最优适用场景,所以你会觉得interface更易用,这个判断是对的。 - 只有当你需要用到
class独有的运行时特性、逻辑封装能力时,再选择class,避免不必要的性能和体积损耗。
内容的提问来源于stack exchange,提问作者Raz Buchnik
相关产品推荐
相关产品推荐

