TypeScript相关知识点

概述:一门开源编程语言,TS是JavaScript的类型超级
官网http://tslang.cn/docs/home.html
为什么使用TS:提高代码质量,更好的开发体验,提高项目维护性
安装npm install -g typescript
mac安装:sudo npm install -g typescript 检验安装版本:tsc -v`
类型的约束
String(字符串)

let str :string =  'strname'

Number(数值)

let num :number = 123

Boolean(布尔)

let boo:boolean = true

Null(空)

let nu:null = null

Undefined(未定义)

let und:undefined =undefined

any(任意)

let data:any = 123

注意:类型小写

array(数组)

let arr1:number[] = [2,3,4,6]
let arrs: Array<number> = [2,3,4,6]
let arr2:string[] = ['sfda','sd','4','sas6']
let arr3:(number | string)[] = [2,3,'5sd',6]
let arr1:[number,string]= [2,'sdsa']

Object(对象)

//方式一接口
interface Person {
  name: string;
  age: number;
  greet: () => string;
}

let user:Person = {
  name: "Alice",
  age: 30,
  greet: function() {
    return `Hello, my name is ${this.name}!`;
  }
};
//方式二:类型别名
type Person = {
  name: string;
  age: number;
  greet: () => string;
};

let user: Person = {
  name: "Bob",
  age: 25,
  greet: function() {
    return `Hello, my name is ${this.name}!`;
  }
};
//方式三:类class
class Person {
  name: string;
  age: number;

  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }

  greet(): string {
    return `Hello, my name is ${this.name}!`;
  }
}

let user = new Person("Carol", 22);
console.log(user.greet()); // 输出: Hello, my name is Carol!
//方式四:构造函数
type PersonConstructor = new (name: string, age: number) => {
  greet: () => string;
};

const Person: PersonConstructor = class {
  private name: string;
  private age: number;

  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }

  greet(): string {
    return `Hello, my name is ${this.name}!`;
  }
};

let user = new Person("Dave", 28);
console.log(user.greet()); // 输出: Hello, my name is Dave!

void(无返回值)

function add(num:number,num3:number):void{
	//return num + num3
	console.log(num + num3)
}
add(23,4)

function(函数)

//普通写法
function add1(num:number,num3:number):number{
	//return num + num3
	console.log(num + num3)
}
add(23,4)
//可选参数,
function add2(num:number,num3?:number):number{
	//return num + num3
	console.log(num )
}
add(23)
//参数默认值
function add3(num:number,num3:number = 1):number{
	//return num + num3
	console.log(num + num3)
}
add(23)
//箭头函数约束写法
let fun:(params1:number,params2:string)=>string(a:number,b:string = '1'):string{
	//return num + num3
	console.log(num + num3)
}
add(23,'23')

接口:interface
注意:定义接口名称首字母大写,分号分割

interface Person {
  name: string;
  age: number;
  greet: () => string;
}

let user:Person = {
  name: "Alice",
  age: 30,
  greet: function() {
    return `Hello, my name is ${this.name}!`;
  }
};
//接口继承
interface Person {
  name: string;
  age: number;
}
interface Children extends Person {
  children:[]
}
let user:Children = {
  name: "Alice",
  age: 30,
  children: [
  	{ 
  	 name: "lice",
  	 age: 3,
  	}{ 
  	 name: "konl",
  	 age: 6,
  	}
  ]
};

类class

在这里插入代码片
class Person {
  name: string;
  age: number;

  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }

  greet(): string {
    return `Hello, my name is ${this.name}!`;
  }
}

let user = new Person("Carol", 22);
console.log(user.greet()); // 输出: Hello, my name is Carol!

public:默认公开的,任何地方都可以访问
private:私有的,当前类内部可以访问
protected:受保护的,当前类和当前类的子类内部可以访问
readonly:只读,不可以修改

abstract:abstract 修饰符用于定义抽象类和抽象方法。抽象类不能被实例化(不能new),并且要求任何继承自它的子类都必须实现其抽象方法。
implements:对于类的约束

泛型
概述:是指在定义函数,接口或class类时,不预先制定类型,而在使用时在指定类型的一种特性

//单个
function add3<T>(num:T,num3:T):T{
	return num + num3
}
add<number>(2,3)
add<string>('23','aa')
//多个
function add3<T,U>(num:T,num3:U):T{
	return num + num3
}
add<number,string>(2,'eew')
add<number[],boolean>([2,43,56,23,4],true)
//接口泛型写法
 interface Icons{
    length:number;
  }
  function fun<T extends Icons>(any:T):number{
    return any.length
  }
 fun<string[]>(['a','b'])
 fun<number[]>([23,45])
 fun<string>('jasfslas')
//class类泛型写法
 class Person<T>{
  userName:T,
   constructor(public name: T) {
      this.UserName = name
    }
 }
 const p = new Person<string>('jinjianzhong')

装饰器
概述:是一个方法,可以注入到类,方法,属性参数上来扩展类,方法,属性参数的功能
注意:使用装饰器,需要在tsconfig.jso n文件配置“experimentalDecorators"选项为"true"
参数:
target : 对于静态方法是构造函数,普通方法是原型对象
propertyKey: 方法名称
descriptor : 方法描述 ,
descriptor.value : 对于静态方法是构造函数,普通方法是原型对象
descriptor.writable : 方法是否可以被重写
descriptor.enumerable: 是否可以被枚举
descriptor.configurable:是否可以改变、删除

类装饰器(无需传递参数)

// 定义一个装饰器工厂函数
function sealed(target: any) {
 	targe.prototype.userName = 'head'
}

// 使用 @sealed 装饰器=》@sealed(MyComponent)
@sealed
class MyComponent {
  // 类定义...
}
const my1 =new MyComponent()
console.log(my1.userName)//head

装饰器工厂

function fun(oprtion:any){
	return function (target: any){
		target.prototype.userName = oprtion.name;
		target.prototype.age = oprtion.age;
	}
}
@fun({
	nsme:'youser',
	age:6
})
class MyComponent {
  // 类定义...
}
const my1 =new MyComponent()
console.log(my1.userName)//youser

装饰器组合
注意:多个装饰器(类装饰器和装饰器工厂结合),执行顺序是先从上到下的执行装饰器工厂,拿到所有真正的装饰器,然后在从下至上的执行所有装饰器

属性装饰器
接受三个参数
target:对于静态成员来说是类的构造函数,对于实例成员是类的原型对象。
propertyKey:成员的名字,一个字符串或Symbol。
descriptor?:属性的描述符(可选),但请注意,在属性装饰器中,描述符对象不会被作为参数传入,因为TypeScript在初始化属性时无法描述或修改一个实例属性的初始化方法。

  function readonlyDecorator(target: Object, propertyKey: string | symbol): void {
  // 将属性设置为只读
  let val = target[propertyKey];
  let getter = function () {
    return val;
  };
  delete (target as any)[propertyKey]; // 删除原属性
  Object.defineProperty(target, propertyKey, {
    get: getter,
    enumerable: true,
    configurable: true
  });
}
class MyClass {  
    @logPropertyAccess  
    public myProperty: string;  
}  
  
let obj = new MyClass();  
obj.myProperty = 'Hello';  // 控制台输出: Setting myProperty to Hello  
console.log(obj.myProperty);  // 控制台输出: Getting myProperty  
// 然后是 'Hello'

方法装饰器
使用场景:

  1. 日志记录:自动记录方法的调用信息,如调用时间、参数、返回值等。
  2. 权限校验:在方法执行前进行权限检查,确保只有具备相应权限的用户才能调用该方法。
  3. 性能监控:测量方法的执行时间,以监控应用的性能瓶颈。
  4. 缓存:为方法调用结果提供缓存机制,减少不必要的计算或数据库查询。
  5. 事务管理:在数据库操作中自动管理事务的开始、提交或回滚。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值