ts函数类型解构
type TypStuobj = {username: string, age: number, phone: string}
function info ({username, age}: TypStuobj) {
console.log(username)
console.log(age)
}
info({username: 'lisi', age: 18, phone: ''})
interface 和type的区别
- 区别1: 定义类型的范围不同
interface 只能定义对象类型或接口当名字的函数类型
type可以定义任何类型,包括基础类型,联合类型,交叉类型,元组 - 区别2:接口可以extends一个或多个接口或类, 也可以继承type,但type没有继承功能,但一般接口继承类和type的场景很少见
- 区别3:用type交叉类型 & 可让类型中的成员合并成一个新的type类型但接口不能交叉合并
- 接口可合并声明 定义两个相同名称的接口会合并声明,定义的两个同名的type会出现编译错误
元组
- 在定义式每个元素的类型都确定
- 元素值的数据类型必须是当前元素定义的类型
- 元素值的个数必须和定义时的个数相同
let salary:[string, number, number, number,number]
= ['张三', 199, 30, 20000, 12]
ts数组和数组元素怎样同时为只读
const account = [10, 20, 30, 40] // 无法保证数组元素不能被改变
const account = [10, 20, 30, 40] as const // 将数组里面的元素 也当做常量
可变元组和他的应用场景
let people:[string, number, ...any[]] = ["张三", 19] // 可变元组
// 解构
let [custname, age, ...rest]:[string, number, ...any[]] = ['张三', 30]
类,静态属性,何时用静态属性
定义:类就是拥有相同属性和方法的一些列对象的集合
展开理解:类是一个模具,是从这该类包含的所有具体对象中抽象出来的一个概念,类定义了它所包含的全体对象和静态类型特征和动态特征
class People {
name: string
age: number
addr: string = "大北窑"
!phone: string
static count: number = 0
constructor (_name: string, _age: number) {
this.name = _name
this.age = _age
People.count++
}
doEat() {}
}
ts单例模式的两种实现
// 饿汉式
class DateUtil{
static dateUtil = new DateUtil()
private constructor () {}
formatDate () {}
diffDateByDay () {}
diffDateByHour () {}
}
const dateUtil = DateUtil.dateUtil
// 懒汉式
class DateUtil{
static dateUtil: DateUtil
static getInstance () {
if (!this.dateUtil) {
DateUtil.dateUtil = new DateUtil()
}
return DateUtil.dateUtil
}
private constructor () {}
formatDate () {}
diffDateByDay () {}
diffDateByHour () {}
}
const dateUtil = DateUtil.dateUtil
ts中getter,setter的使用和意义
class People {
name: string
!_age: number
addr: string = "大北窑"
!phone: string
static count: number = 0
constructor (_name: string) {
this.name = _name
People.count++
}
doEat() {}
set age (val: number) {
if(val < 128 && val > 10) {
this._age = val
} else {
throw new Error("年龄不在合适范围")
}
}
get age () {
return this._age
}
}