* 1、什么是泛型: 我们可以理解为泛型就是在编译期间不确定方法的类型(广泛之意思),在方法调用时,由程序员指定泛型具体指向什么类型;
* 2、泛型作用: 通常解决类,接口,方法的复用性,以及对非特定数据类型的支持;
/*
* getMsg其中T为一个泛型
* (msg:T)为T为类型
* :T返回出去的也是一个泛型
*/
function getMsg(msg: T): T {
return msg
}
let msg = getMsg('新增类型')
let num = getMsg(12)
console.log(msg, num);
let userInfo = {
name: 'xt',
age: 12
}
需求:定义一个对象想要返回对象中的值
let userInfo = {
name: 'xt',
age: 12
}
错的做法:
function getVal(o: object, key: string) {
return o[key]
}
改善型方法
但是返回的是any,这种写法和js没什么太大的意义了
function getVal(o: any, key: string) {
return o[key]//返回any类型
}
// let name: any
let name = getVal(userInfo, 'name')
let age = getVal(userInfo, 'age')
console.log('name', name, age);
最终正确使用typescript语法:
针对getVal这个方法可以用泛型约束
/**
* K extends keyof T 意思是根椐传入的T类型获取T中的属性,也传的K必须在T中的属性中有
*/
function getProperty(obj: T, key: K) {
return obj[key]
}
let name1 = getProperty(userInfo, 'name')
let age1 = getProperty(userInfo, 'age')
console.log(' K extends keyof T 意思是根椐传入的T类型获取T中的属性,也传的K必须在T中的属性中有', name1, age1);
泛型条件
// 泛型条件
console.log('泛型条件=========>');
/**
*解说: 返回类型为泛型,如果传入的泛型符合{ name: infer Tes } 就返回Tes 否则返回unknow
*/
type Fas = T extends { name: infer Tes } ? Tes : unknow
type FasTest = Fas<{ name: string }>//type FasTest = string 符合
type FasTest1 = Fas//type FasTest1 = unknow 不符合,类型中没有name
type FasTest2 = Fas<{ age: number }>//type FasTest2 = unknow 不符合,类型中没有name
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)