Set,Map?
Map的特点[我们可以利用Map的特性作用于通过键快速查找的数据]:
是一个键值对的集合,每个键都对应一个值。
键和值可以是任意类型。
键是唯一的,但值可以重复。
保持插入顺序,即遍历时会按照插入的顺序返回键值对。
Set的特点[利用Set特性进行去重,存储不重复的数据]:
是一个集合,存储唯一的值。
只能存储值,没有键。
值必须是唯一的,重复的值会被忽略。
保持插入顺序,即遍历时会按照插入的顺序返回值。
接口和抽象类的区别?
TS接口:
TS中的接口主要是用接口描述对象的结构;正如在官方文档中说的“我们在这里并不能像在其它语言里一样,说传给 printLabel的对象实现了这个接口。我们只会去关注值的外形。 只要传入的对象满足上面提到的必要条件,那么它就是被允许的。”
注意点:
可索引类型:索引签名可以是number或string类型,数字索引签名的返回值类型必须是字符串索引签名返回值类型的子类型。这样可以确保类型安全。
当一个类实现了一个接口时,只对其实例部分进行类型检查。 constructor存在于类的静态部分,所以不在检查的范围内。
一个接口可以继承多个接口,创建出多个接口的合成接口。
当接口继承了一个类类型时,它会继承类的成员但不包括其实现。 就好像接口声明了所有类中存在的成员,但并没有提供具体实现一样。 接口同样会继承到类的private和protected成员。 这意味着当你创建了一个接口继承了一个拥有私有或受保护的成员的类时,这个接口类型只能被这个类或其子类所实现。
TS抽象类
抽象类:一般情况下,抽象类我们一般作为基类(父类,超类),所以不会被实例化。和抽象类内部的抽象方法一样,使用abstract定义。
抽象类内部的抽象方法:必须要在派生类(子类)中实现
TS接口和抽象类的区别
- 抽象类有自己的构造函数,抽象类的派生类必须在constructor函数中调用super();接口没有构造函数。
- 抽象类保留的类的特性,可以设置访问修饰符,所以包含了静态部分和实例部分;接口则没有;
- 一个类只能继承一个类,但是可以实现多个接口,做到合成接口;
- 作用不同,接口主要指定一些固定好的结构(接口只负责定义方法和属性的签名,不负责实现),抽象类则是声明一个泛用的基类(抽象类则是侧重一部分逻辑的复用,一部分方法的实现);
- 实现方式不同,abstract(继承extends),interface(实现implents);
总结:接口只负责指定行为规范,抽象类更侧重逻辑的复用。
Protected,private,public?
Public:公共修饰符,在TS中所有的属性,方法默认就是public
Private:私有修饰符,不能在声明它的类的外部访问
Protected: 受保护修饰符, producted成员在派生类中仍然可以访问。构造函数也可以被标记成 protected。 这意味着这个类不能在包含它的类外被实例化,但是能被继承。
注意:在Ts中,我们在比较两种类型时,一般不在乎来源,只有它们的所有成员类型都是兼容的,那么就认为它们的类型是兼容的。但是如果类中声明了private或pritected,则它们在比较时,必须来源一致(既来源于同一处声明,如继承)。
补充:readonly关键字将属性设置为只读的。 只读属性必须在声明时或构造函数里被初始化。
Static,类的静态部分?
静态属性:这些属性存在于类本身上面而不是类的实例上,想要访问这个属性的时候,都要在前面加上类名。
实例属性存在实例对象上,而实例方法存在类的原型上面,可以通过prototype(原型链访问)
静态属性和静态方法都存在构造方法中。
补充:如何在类的外部修改静态属性?
事实上,在ts中类具有静态部分和实例部分,一般情况下,new的实例对象只能改动实例部分内容;但是我们可以通过直接复制整个类(包含静态部分和实例部分),就可以修改类的静态属性。