函数
函数的基本使用
函数是JavaScript应用程序的基础,在TypeScript中虽然已经支持类,命名空间和模块,但函数仍然是主要的定义行为的地方。
1.匿名函数
关键字 变量名 = function(参数:参数类型):返回值类型{操作语句}
2.有名函数 | 命名函数 | 普通函数
function 函数名(参数:参数类型):返回值类型{操作语句}
3.箭头函数
关键字 变量名 = (参数:参数类型)=>{语句}
4.接口类型
(函数的约束):type 别名 = (字面量1:类型,字面量2:类型)=>返回值类型
(函数的具体实现):关键字 函数名:变量名 = (形参1:类型,形参2:类型)=>操作语句
函数参数的处理
可选参数:在参数后面写?,调用时可以不传参,也可以将undefined传给可选参数
const fn = (a:number,b?:number)=>{
// return a+b//可运算,书写时报错
return a
}
console.log(fn(1));
参数默认值:当参数有默认值,不传参时调用默认值,传参时调用传递的参数
const fn1 = (a:number,b:number=100)=>{
return a+b
}
console.log(fn1(50));
剩余参数:...args,剩余参数可以指定类型,例如...args:any[],将剩余的参数放在数组中
const fn2 = (a:number,b:string,...c:any[])=>{
console.log(a);
console.log(b);
console.log(c);
}
fn2(18,"张","金","玉",419511)
构造函数
语法格式:var 变量名 = new Function(参数1,参数2,函数体)
var fn = Function("a","b","return a>b?a:b")
console.log(fn(100,50));
函数重载
重载是方法名字相同,而参数不同,返回类型可以相同也可以不相同
如果参数类型不同,则参数类型应设置为any
参数数量不同可以将不同的参数设置为可选参数
例:
export default{}
// 函数重载
// 类型不同
function fn1(a:string,b:string):string
function fn1(a:number,b:number):number
function fn1(a:string,b:number):string
function fn1(a:number,b:string):string
function fn1(a:any,b:any):any{
return a+b
}
console.log(fn1(1,2));
console.log(fn1("1","2"));
console.log(fn1("1",2));
console.log(fn1(1,"2"));
// 数量不同
function fn2(a:string):string;
function fn2(a:number,b:number):number;
function fn2(a:any,b?:number){
return a
return b
}
console.log(fn2("oooo"));
console.log(fn2(1,2));
类的使用
类的基本使用
类描述了所创建的对象共同的属性和方法
定义类的关键字为class,后面紧跟类名(首字母大写)
类的数据成员:
字段(属性)--是类里面声明的变量表示对象的有关数据
构造函数 --constructor
是类里面的构造函数,类实例化时调用,可以为类的对象分配内存
方法(函数) --对象要执行的操作
//示例
export default{}
// 创建一个类
class Person {
name:string;
age:number;
// 构造函数
constructor(name:string,age:number){
this.name=name;
this.age=age
}
// 方法函数
fn():void{
console.log(`她叫${this.name},今年${this.age}岁`);
}
}
// 实例化
let p = new Person("张三",22);
p.fn()
类的继承
可以在创建类的时候继承一个已存在的类
已存在的类为父类,继承他的为子类
继承类的关键字是extends
子类除了不能继承父类的私有成员(方法和属性)和构造函数,其他的都可以继承
在ts中一次只能继承一个类,不支持继承多个类,但可以多重继承
super用来调用父类中的成员(构造函数和方法等)
export default{}
// 创建一个类
class Person {
name:string;
age:number;
// 构造函数
constructor(name:string,age:number){
this.name=name;
this.age=age
}
// 方法函数
fn():void{
console.log(`她叫${this.name},今年${this.age}岁`);
}
}
class Major extends Person{
major:string;
// 构造函数
constructor(name:string,age:number,major:string){
// 继承父类的构造函数
super(name,age);
this.major=major
}
// 方法函数
fn2():void{
// 调用父类的方法
super.fn()
console.log(`她叫${this.name},今年${this.age},学习的专业是${this.major}`);
}
}
let m = new Major("贝贝",22,"语文教育")
m.fn2()
static与instanceof
static
关键字用于定义类的数据成员为静态的,静态成员可以直接通过类名调用
instanceof
运算符用于判断对象是否是指定的类型,返回布尔值
类的修饰符
public(默认):公有可以在任何地方访问
protected:受保护,可以被其自身以及子类访问
private:私有,只能被其定义所在的类访问
readonly:可以使用readonly
关键字将属性设置为只读的。只读属性必须在声明时或构造函数里被初始化。
getter与setter
又称 存取器,通过getter与setter来截取对对象成员的访问
-
如果存在get,但没有set,则该属性自动是只读的
-
如果没有指定setter参数的类型,他将从getter的返回类型中推断出来
-
访问器和设置器必须有相同的成员可见性
抽象类
定义
-
抽象类作为其他派生类的基类使用。它们一般不会直接实例化
-
抽象类是专门用于定义那些不希望被外界直接创建的类的
-
和接口一样用于约束子类的
抽象类和接口的区别
-
抽象方法必须包含
abstract
关键字,并且可以包含访问修饰符 -
接口中只能定义约束,不能定义具体实现。
-
抽象类既可以定义约束,也能定义具体实现
implements子句
类的初始化顺序
基类的字段被初始化 => 基类构造函数运行 => 子类的字段被初始化 => 子类构造函数运行