TypeScript学习(五):Handbook -> Generics

374 阅读1分钟

泛型函数

就算不指定泛型类型,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;