泛型函数
就算不指定泛型类型,TS 也会从参数中推导出。
function identity<T>(arg: T):T{
return arg
}
function identity("abc"){
return "abc"
}
// 等同于
function identity<string>("abc"){
return "abc"
}
各种写法
interface GenricIdentityFn{
<T>(arg: T):T;
}
interface GenricIdentityFn1<T>{
(arg:T):T
}
泛型类
注意:泛型类的 【类型参数T】 只对类的实例方法、属性有约束。对于静态方法、属性没有作用。
class GenericNumber<T>{
zeroValue: T;
add: (x:T, y:T) => T
}
函数中 extends 的作用
泛型是不受约束的可以是任意类型,利用 extends 可以约束泛型的类型。如下:迫使泛型T必须拥有 length 属性
interface Lengthwis {
length: number;
}
function loggingIdentity<T extends Lengthwise>(arg: T):T {
console.log(arg.length)
}
function loogingIdentity<T>(arg: T):T{
// 报错
console.log(arg.length)
}
在泛型约束中使用类型参数 Using Type Parameters in Generic Constraints
keyof 返回一个联合类型
function getProperty<T, K extends Keyof T>(obj:T, key: K){
return obj[key]
}
const x = {a:1}
getProperty(x, "a")
// 报错
getProperty(x, "b")
在泛型中使用类类型
new代表的是构造函数
function create<T>(c: { new (): T}):T {
return new c()
}
class BeeKeeper{
hasMask: boolean = true
}
class ZooKeeper{
nameTag: string = "Mikle"
}
class Animal{
nameLegs: number = 4
}
class Bee extends Aniaml{
keeper: BeeKeeper = new BeeKeeper()
}
class Lion extends Animal{
keeper: ZooKeeper = new ZooKeeper()
}
function createInstance<A extends Animal>(c: new () => A): A{
return new c()
}
createInstance(Lion).keeper.nametag;
createInstance(Bee).keeper.hasMask;