接口
作用
接口的作用就是为这些类型命名和为你的代码或者第三方代码定义契约
简单来说接口就是用于封装一系列的需求限制条件
定义接口
通过 interface关键字定义接口
interface person{
name: string;
iphone?: number;
readonly sex: string;
[propName: string]: any;
[index: number]: string;
SearchFunc?: (source: string, subString: string) => boolean,
}
function Fn(option: person){
console.log(option)
}
Fn({name:'张三', sex:'男', height:180})
类 interface
通过implements关键字可以让一个类实现一个接口,要求必须实现接口定义的方法
interface ClockInterface {
currentTime: Date;
setTime(d: Date);
}
class Clock implements ClockInterface {
currentTime: Date;
setTime(d: Date) {
this.currentTime = d;
}
constructor(h: number, m: number) { }
}
类
类class出现的目的,其实就是吧一些相关的东西放在一起,方便管理
基本语法
class Person{
name:string; // 变量
public school: string; // 公共变量, 谁都能用(默认public)
private wegiht: string; // 私有变量,只能在本类使用,不能在其他地方被使用
protected money: number; // 只能在自身类和其派生类中使用
readonly sex: string = '男'; // 只读不能修改其属性值 只读属性必须在声明时或构造函数里被初始化
// 所有子类访问和修改相同的一个属性和方法就可以将其定义为静态方法和属性
static origin = {x: 0, y: 0}; // 静态属性 person.origin(调用方式)
constructor(name: string){ // 构造函数
this.name = name;
}
// 方法同样拥有 public private protected
seep(){ //方法
return `seep:${this.name}`
}
}
// 同类修饰符只能有一个
// 三种修饰符有先后顺序,分别是:访问、静态、只读
// 类的使用
const person = new Person('张三');
// 类的继承
// 子类实例是可以继承父类所有的public和protected的属性和方法
class Son extends Person{
constructor(name: string) { super(name); }
}
// 抽象类
// 允许创建一个对抽象类型的引用
// 不能创建一个抽象类的实例
// 需要注意,拉安美仅仅作为基类,不自new
abstract class Animal {
abstract makeSound(): void; // 抽象类中的抽象方法不包含具体实现并且必须在派生类中实现
move(): void {
console.log('roaming the earch...');
}
}
抽象类和接口的区别
- 抽象类要被子类继承,接口要被类实现
- 接口只能做方法声明,抽象类中可以作方法声明,也可以做方法实现
- 接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量
- 接口是设计的结果,抽象类是重构的结果
- 抽象类和接口都是用来抽象具体对象的,但是接口的抽象级别最高
- 抽象类可以有具体的方法和属性,接口只能有抽象方法和不可变常量
- 抽象类主要用来抽象类别,接口主要用来抽象功能
- 简单来说抽象类为类服务,非类需要抽象思维就用接口
泛型
官方介绍
软件工程中,我们不仅要创建一致的定义良好的AP1,同时也要考虑可重用性。 组件不仅能够支持当前的数据类型,同时也能支持末来的数据类型,这在创建大型系统时为你提供了十分灵活的功能。在像C#和Java这样的语言中,可以使用泛型来创建可重用的组件,一个组件可以支持多种类型的数据。这样用户就可以以自己的数据类型来使用组件
你可以将泛型理解为宽泛的类型,它通常用于类和函数
核心思想
其实不管是用于类还是用于函数,核心思想都是:把类型当一种特殊的参数传入进去
基本语法
function identity<T>(arg: T): T{
return arg;
}
let myIdentity1: <U>(arg: U) => U = identity;
let myIdentity2: {<T>(arg: T): T} = identity;
console.log(identity('dd'))
console.log(identity<number>(22))
class Person<T>{
private _value: T;
constructor(val: T){
this._value = val;
}
}
interface GenericIdentityFn{
<T>(arg: T): T;
}
let myIdentity3: GenericIdentityFn = identity;
|