1.identity函数,这个函数会返回任何传入它的值,可以看作是echo命令
function identity(arg:number):number
{
return arg
}
或
使用any类型会导致这个函数可以接收任何类型的参数,这样会丢失一些信息,传入与返回类型应该是相同的 有特殊变量表示 类型变量:T
function indentity(arg:any):any{
return arg
}
function identity<T>(arg:T):T{return arg}
2.定义泛型函数,两种使用方法:
let output = identity<string>('mystring'')
明确了T类型是string
2.类型推论–即编辑器会根据传入的参数自动确定T的类型
let output = identity('mystring')
3.使用泛型变量:
function indentity<T>(arg:T):T{
console.log(arg.length) //error 有可能传入的是number没有length
}
4.可创建数组
function indentity<T>(arg:T[]):T[]{
console.log(arg.length)
}
//或者
function indentity<T>(arg:Array<T>):Array<T>{}
5.泛型类型:
泛型函数的类型与非泛型函数的类型没有什么不同,只是一个类型参数在最前面
function indentity<T>(arg:T):T{
return arg
}
let myIndent:<T>(arg:T)=>T=indetity
let myindent:<U>(arg:U)=>U=indentity //不同的泛型参数名
6.泛型接口:
interface Fn{
<T>(arg:T):T
}
function indent<T>(arg:T):T{
return arg
}
let myindent:Fn=indent
7.还可创建泛型类,注:无法创建泛型枚举和泛型命名空间
泛型类:指的是类的实例部分,所有类的静态属性不能使用这个泛型类
class Fn<T>{
zeroValue:T;
add:(s:T,y:T)=>T
}
let fn1 = new Fn<number>()
fn1.zeroValue=0
fn1.add=function(x,y){return x+y}
8.泛型约束:
interface Length{
length:number
}
function indentity<T extends Length>(arg:T):T{
console.log(arg.length) //error
//这个泛型函数已经被定义了约束,不宰适用于任意类型
}
//需要传入符合约束类型值,必须包括必须的属性
indentity({length:10,value:3})
9.在泛型约束中使用类型参数:
function obj(obj:T,key:K){
return obj[key]
}
let x = ['a','b','c']
obj(x,'a') //ok
obj(x,'aa') //error a b c
10.在泛型里使用类类型:
function create<T>(c:{new() :T}):T{
return new c()
}