JavaScript是弱类型语言,TypeScript是强类型语言,TypeScript 是 JavaScript 的一个超集,可以在编译期间发现并纠正错误,降低了试错的成本也提升了代码的规范性。
一、ts中的接口Interface
接口的作用:在面向对象编程中,接口是一种规范的定义,它定义行为和动作的规范。在程序设计里面,接口起到一定的限制和规范作用。
1. 定义接口对函数中的参数进行约束
// 必选
interface FullName {
firstName:string;
secondName:string
}
// 可选
interface FullName {
firstName:string;
secondName?:string // 添加?号之后 secondName为可选
}
// 定义了该函数的参数类型为 FullName接口类型,所以调用该函数时,传的参数必须是接口中定义的(firstName:string,secondName:string),字段名和类型必须统一,否则报错
function printName(name:FullName){
console.log(name.firstName+'---'+name.secondName)
}
var obj = {
firstName:'wu',
secondName:'yanzu'
}
printName(obj)
2.类实现接口
// 对类的约束,和抽象类有点像
interface Animal{
name:string
eat(str:string):void;
}
class Dog implements Animal{
name:string
constructor(name:string){
this.name = name
}
eat(){
console.log(this.name+'吃肉')
}
}
var d = new Dog('小黑')
二、ts中的类
抽象类: abstract 修饰, 里面可以没有抽象方法。但有抽象方法(abstract method)的类必须声明为抽象类(abstract class)
多态: 父类定义一个方法不去实现,让继承它的子类去实现 每一个子类有不同的表现
/**
* Animal 是一个抽象类,里面含有一个eat()抽象方法
*/
abstract class Animal {
public name:string;
constructor(name:string) {
this.name=name;
}
//抽象方法 ,不包含具体实现,要求子类中必须实现此方法
abstract eat():any;
//非抽象方法,无需要求子类实现、重写
run(){
console.log('非抽象方法,不要子类实现、重写');
}
}
class Dog extends Animal {
//子类中必须实现父类抽象方法,否则ts编译报错
eat(){
return this.name + "吃肉";
}
}
class Cat extends Animal {
//子类中必须实现父类抽象方法,否则ts编译报错
eat(){
return this.name+"吃鱼";
}
}
var dog =new Dog("tom");
var cat=new Cat("kitty");
console.log(dog.eat());
console.log(cat.eat());
三、ts中的泛型
可以把泛型理解为在编译期间不确定方法的类型(广泛之意思),在方法调用时,指定泛型具体指向什么类型。
//1.泛型函数,可以指定函数的参数,返回值类型为泛型
function getMin<T>(arr:T[]):T {
var min=arr[0];
arr.forEach((value)=>{
if(value<min){
min=value;
}
});
return min;
}
console.log(getMin([1, 3, 5, 7, 8]));
console.log(getMin(["tom","jerry","jack","sunny"]));
//2 泛型类
class GetMin<T>{
arr:T[]=[];
add(ele:T){
this.arr.push(ele);
}
getArr():T{
return this.arr;
}
}
var gm1= new GetMin<number>();
gm1.add(5);
gm1.add(3);
console.log(gm1.getArr());
var gm2= new GetMin<string>();
gm2.add("tom");
gm2.add("jerry");
console.log(gm2.getArr());