为什么TypeScript在实现时允许重复组件?

Ram*_*ran 5 oop inheritance ecmascript-5 typescript angular

为什么TypeScript允许重复组件implements

import { Component,OnInit } from '@angular/core';

export class CreateVersionComponent implements OnInit, OnInit, OnInit { }// no error
export class CreateVersionComponent extends OnInit, OnInit, OnInit { }// getting error
Run Code Online (Sandbox Code Playgroud)

但它在组件扩展时抛出重复的标识符错误.

那么打字稿在实现时接受重复组件的原因是什么?我们需要使用哪种情况?

Sef*_*efe 7

要理解为什么第一个代码不是问题,但第二个代码是,你需要理解类和接口之间的区别.接口是其实现者至少提供接口成员的保证.它不提供任何实际功能.但是一个类可以包含实现代码; 您可以从类继承以重用该代码并通过添加新代码或更改现有实现来更改其行为.

这意味着,implementsextends具有不同的含义.implements说:我可以向这个类的每个消费者保证,它至少会有接口的成员.由于接口中没有实际的实现,因此只要该类实现了所有这些保证,就可以制作多个这些保证.你是对的,多次添加相同的保证没有任何意义,但它确实也不会受到伤害.TypeScript的创建者可能被禁止多次实现该接口.我们可以推测他们为什么没有; 我的猜测是,由于TypeScript基于JavaScript而且JS非常宽容,他们不想禁止不会造成任何损害的东西.请注意,TS是JS之上的类型层,并且在编译到JS期间最终会丢弃所有类型信息.在这种情况下,丢弃多个重复的接口实现并没有真正受到伤害,因为结果将完全相同.

除此之外implements,extends是一个不同的故事.虽然有一些语言允许多重继承(例如C++),但是多重继承伴随着许多困难的实现细节(例如菱形问题或调用基类构造函数),所以许多语言不支持它的想法引起的问题比它可能解决的问题多.TypeScript不允许多重继承,这意味着您不能extends在一般原则上使用多个基类.与实现接口不同,继承类会对程序的工作方式产生影响,编译器所做的不仅仅是剥离类型信息.这就是为什么在那里引发错误是有道理的.