一、函数的基本使用
函数是Javascript应用程序的基础。可以实现抽象层、模拟类、信息隐藏和模块。在Typescript里,虽然已经支持类、命名空间和模块,但函数仍然是主要的定义行为的地方。Typescript为JavaScript函数添加了额外的功能。让我们更容易的使用
函数定义的方式:
匿名函数:
const nim = function (one, two) {
return one + two
}
let res = nim(100, 800)
console.log(res);
命名函数|普通函数
function two(name: string, age: number) {
return `我叫${name},今年${age}岁`
}
let res1 = two("张三", 18)
console.log(res1);
箭头函数
const three = (time: number): void => {
console.log(`我每天敲${time}小时代码`);
}
three(8)
接口函数
type myFunc = (x: number, y: number) => number
const four: myFunc = (a: number, b: number) => a + b
let res2 = four(3, 2)
console.log(res2);
二、函数参数的处理
export default {}
//可选类型
const func1: (a: number, b: number) => number = (x: number, y: number) => {
return x;
}
console.log(func1(1000, 2000));
const func2 = function (a: number, b?: number): number {
return a;
}
// func2(10);
// func2(10, 20);
// func2(10, undefined);
console.log(func2(10));
console.log(func2(10, 20));
console.log(func2(10, undefined));
// 参数的默认值
const func3 = function (x: number = 100, y: number = 200, z: number = 300) {
return x + y + z
}
let res = func3(100, 200)
let res1 = func3(100, 200, 400)
console.log(res);
console.log(res1);
// 函数的剩余参数
const func4 = function (...args: any[]) {
console.log(args);
}
func4(1, 2, 3, 4, 5, "张三")
const func5 = function (a: number, b: string, ...args: any[]) {
console.log(a);
console.log(b);
console.log(args);
}
func5(10, "20", 30, "张三", "李四")
三、构造函数
export default {}
//构造函数
var one = new Function("a", "b", "return a*b");
var res = one(10, 20)
console.log(res);
四、函数重载
函数重载是方法名字相同,而参数不同,返回类型可以相同也可以不相同
每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表
export default {}
// 重载函数
function addFunc(a: number, b: number): number
function addFunc(a: string, b: string): string
function addFunc(a: number, b: string): number
function addFunc(a: string, b: number): number
function addFunc(a: any, b: any): any {
return a + b;
}
addFunc(10, 20)
addFunc("10", "20")
addFunc(10, "20")
addFunc("10", 20)
console.log(addFunc(10, 20));
console.log(addFunc("10", "20"));
console.log(addFunc(10, "20"));
console.log(addFunc("10", 20));
//函数参数不同
function star(s1: string): string;
function star(n1: number, s1: string): string
function star(x: any, y?: any): string {
return x;
console.log(x);
console.log(y);
}
console.log(star("王五",));
五、类的基本使用
定义
- Typescript是面向对象的JavaScript
- 类描述了所创建的对象共同的属性和方法。
- Typescript支持面向对象的所有特性,比如类、接口等。
export default {}
// 创建一个类
class Person {
name: string
age: number
constructor(name: string, age: number) {
this.name = name;
this.age = age
}
// 函数(方法)
sayHello(): void {
console.log(`我的女神是${this.name},她今年${this.age}岁了,但是在我心里她永远18岁!`);
}
}
// 实例化
let p = new Person("成果", 27);
p.sayHello()
六、类的继承
TypeScript支持继承类,即我们可以在创建类的时候继承一个已存在的类,这个已存在的类称为父类,继承它的类称为子类。类继承使用关键字extends,子类除了不能继承父类的私有成员(方法和属性)和构造函数,其他的都可以继承。
Typescript一次只能继承一个类,不支持继承多个类,但TypeScript支持多重继承(A继承B,B继承C)。
export default {}
// 创建一个类
class Person {
name: string
age: number
constructor(name: string, age: number) {
this.name = name;
this.age = age
}
// 函数(方法)
sayHello(): void {
console.log(`我的女神是${this.name},她今年${this.age}岁了,但是在我心里她永远18岁!`);
}
}
// 实例化
let p = new Person("成果", 27);
p.sayHello()
class Student extends Person {
score: string
constructor(name: string, age: number, score: string) {
// 调用父类中的构造函数
super(name, age)
this.score = score
}
sayHello(): void {
// 调用父类中的方法
// super.sayHello()
// 重写父类中的函数
console.log(`我是重写的方法,我叫${this.name},今年${this.age}岁,我的评分是${this.score}`);
}
}
let s = new Student("张三", 20, "sss")
s.sayHello()
七、static和instanceof
static关键字用于定义类的数据成员(属性和方法)为静态的,静态成员可以直接通过类名调用。instankeof运算符用于判断对象是否是指定的类型,如果是返回true,否则返回false。
export default {}
class StaticTest {
static salary: number
static say(): void {
console.log(`我们想要的工资是${StaticTest.salary}k`);
}
}
StaticTest.salary = 10000;
StaticTest.say()
class Person { }
let p = new Person()
let isPerson = p instanceof Person;
console.log("p是Person实例化出来的吗?" + isPerson);
class Student extends Person { }
let s = new Student()
let isStudent = s instanceof Person;
console.log("s是Person实例化出来的吗?" + isStudent);
八、类中的修饰符
public(默认):公有,可以在任何地方被访问
protected:受保护。可以被其自身以及其子类访问
private:私有,只能被其定义所在的类访问,
readonly:可以使用readon1y关键字将属性设置为只读的。只读属性必须在声明时或构造函数里被初始化。
export default {}
class Person {
public name: string
protected age: number
private sex: string
constructor(name: string, age: number, sex: string) {
this.name = name
this.age = age
this.sex = sex
}
say(): void {
console.log(`我的名字是${this.name}性别是${this.sex},年龄是${this.age}`);
}
}
class Studemt extends Person {
score: string
constructor(name: string, age: number, sex: string, score: string) {
super(name, age, sex)
this.score = score
}
say(): void {
console.log(this.name);
console.log(this.age);
// console.log(this.sex); //私有的
console.log(this.score);
}
}
//**readonly**:可以使用‘readonly`关键字将属性设置为只读的。只读属性必须在声明时或构造函数里被初始化。
class Print {
readonly str4string = "我是声明时赋值的"
readonly str2: string
readonly str3: string
readonly str4: string
readonly str5: string
constructor(str2: string, str3: string, str4: string, str5: string) {
this.str2 = str2;
this.str3 = str3;
this.str4 = str4;
this.str5 = str5
}
// say():void{
// this.str2="爱你"
// }
hs(): void {
console.log(this.str2, this.str3, this.str4, this.str5);
}
}
let p = new Print("刘亦菲", "刘亦菲2", "刘亦菲3", "刘亦菲4")
p.hs()
九、getter和setter
如果存在get,但没有set ,则该属性自动是只读的
如果没有指定setter参数的类型,它将从getter的返回类型中推断出来
访问器和设置器必须有相的成员可见性
export default {}
class MyName {
private _fullName: string = "杨幂";
//读取字段的值
get fullName() {
console.log("get被调用了");
return this._fullName;
}
//为字段赋值
set fullName(newName: string) {
console.log("set被调用了");
this._fullName = newName;
}
}
let n = new MyName()
n.fullName = "赵六"
console.log(n);
console.log(n.fullName);
十、抽象类
定义
抽象类做为其它派生类的基类使用。它们一般不会直接被实例化抽象类是专门用于定义哪些不希望被外界直接创建的类的
抽象类和接口一样用于约束子类
抽象类和接口区别
抽象方法必须包含abstract关键字并且可以包含访问修饰符
接口中只能定义约束,不能定义具体实现。而抽象类中既可以定义约束,又可以定义具体实现
export default {}
abstract class Person {
abstract name: string
abstract age: number
abstract show(): string
showName(): void {
console.log("Hello World");
}
}
class Student extends Person {
name: string = "成果"
age: number = 27
show() {
return "爱情公寓5"
}
}
let s = new Student()
let res = s.show()
console.log(res);
十一、类的初始化顺序
- 基类的字段被初始化
- 基类构造函数运行
- 子类的字段被初始化
- 子类构造函数运行
export default {} class Old { name: string = "李易峰"; constructor() { console.log(`我是${this.name},我主演了古剑奇谭`); } } class Young extends Old { name: string = "刘亦菲"; constructor() { super() console.log(`我是${this.name},我主演了天龙八部`) } } let y = new Young()