5、深入掌握TS-泛型

泛型特点

  • 定义时不明确使用时必须明确成某种具体数据类型的数据类型
  • 编译期间进行数据类型检查的数据类型
interface Ref<T>{
	value: T
}
let ref: Ref<string> = {
	value: 'string'
}

泛型默认值

class ArrayList<T=any> {
	
}

复习:keyof

表示获取一个类或对象类型或者一个接口类型的所有属性名[key] 组成的联合类型

class Order {
	orderid: boolean
	ordername: string
	static count:number
	printOrd () {}
	static getCount () {}
}
type OrdTyp = keyof Order

复习:索引访问类型

class Order {
	orderid: boolean
	ordername: string
	static count:number
	printOrd () {}
	static getCount () {}
}
type OrdIdTyp = Order['orderid']

扩展:使用泛型

type instancePropKeys<T extends object> = keyof T

函数重载

一组具有相同名字,不同参数列表和返回值无关并且具有一个实现签名和一个或多个重载签名的函数

function foo (a: string):string // 重载签名 没有函数体
function foo (b: number): number // 重载签名
function foo (a: string | number): string | number | undefined { // 实现签名
	if (typeof a === 'string') {
		return '1'
	} 
	if (typeof a === 'number') {
		return 1
	}
}

实现签名参数及返回类型 必须完全兼容重载签名

泛型工厂函数类型

可以代表任意一个类的函数类型

new (...args:any) => any

实际应用:要求创建对象的时候都统一打印一句话

function crateFactoryConstructor(constructorTyp: new (...args:any) => any) {
	console.log(constructorTyp.name + '被创建')
	new constructorTyp()
}

交叉类型和通用交叉方法

两个类型求并集

type O1 = {a: string, b:number}
type O2 = {c: number, d: number}
type O3 = O1 & O2
// O3 相当于 {a: string, b:number,c:number,d:number}

通用交叉方法

function cross<T extends object, U extends object>(o1:T,o1:U) :T&U{
	const combine = {} as T & U
	unoin(combine, o1)
	unoin(combine, o2)
	return combine  
}
function union (combine:any, curobj:any) {
	for (let k in curobj) {
		combine[k] = curobj[k]
	}
	return combine
}

你可能感兴趣的:(javascript,typescript,前端)