基本使用示例:
JavaScript中实现一个函数传入数据返回数据本身
function id(value: any):any{return value}
该方法会导致失去TS的类型保护,从而使得数据类型不安全
解决方法:使用TS泛型
//定义该函数
function id<type>(value: Type): Type{return value}
//调用该函数
let num = id<number>(10)//此时num类型为number
//由于TS的类型推论机制,可以简写为如下代码
let num = id(10) //此时num类型为10,即为字面量类型
泛型约束
默认情况下,泛型的类型type代表了多个类型,这就导致了无法访问任何元素的属性
function id<Type>(value: Type): Type {
//console.log(value.length)//err:value不含有length属性
return value
}
更改方法:使用泛型收缩类型
主要有两种方法
1.指定更加具体的类型
//把type改写为数组类型
function id<Type>(value: Type[]): Type[] {
console.log(value.length)
return value
}
2.添加约束
//添加有length属性的接口
interface ILength{length:number}
//让函数的属性Type继承ILength,则Type具有了length的属性
function id<Type extends ILength>(value: Type): Type {
console.log(value.length)
return value
}
//具有length的变量类型都可以调用该函数
id(['a','b','c']} //数组有length属性
id(abc) //字符串有length属性
id({lenth:10,name:jack}) //对象有length属性
//id(123)//错误演示,number不具有length属性
类型变量之间可以互相约束
列子:创建一个函数来获取对象中的属性的值
function getProp<Type,key extends keyof Type>(obj:Type,key:key){
return obj[key]
}
let person = {name:'jack',age:18}
getProp(person,'name')
//只有有包含关系都可以访问,如:
getProp(18,'toFixed')
getProp('abc','split')
getProp('abc',1)//此时1表示索引,即为abc中的b
getProp(['a'],'length')