Skip to content

Latest commit

 

History

History
86 lines (64 loc) · 1.79 KB

泛型编程.md

File metadata and controls

86 lines (64 loc) · 1.79 KB

泛型

类型参数化

即便是类型也可以更灵活,使函数更具有通用性,这是由于js本身过于灵活的特性决定的。

function fn<T>(arg: T){
    return arg
}

传入的类型是什么类型,函数fn接收的参数就是什么类型。这可和any不一样,因为any会丢失类型,而泛型是根据传入的参数决定类型,是参数类型的动态化,在调用时决定。

调用时可以不指定函数,ts会自动进行类型推导,而且推导出来的类型会更具体。但这样会增加一些ts编译器的负担,并且推导出来的类型并不总是正确的。

const fn1 = fn<number>(18)
const fn2 = fn('flten')

泛型接口和泛型类

泛型接口,默认指定为string

interface Animal<T = string> {
    name: T,
    age: number,
    food:T,
}

动态决定泛型参数类型
const monkey:Animal<string> = {
    name: 'flten',
    age 18,
    food: 'noodle',
}

泛型类

class Animal<T = string> {
    name: T,
    food: T,
    constructor(name:T, food:T){
        this.name = name
        this.food = food
    }
}

const bird = new Animal('flten', 'pest')

泛型约束

对传入的参数类型结构进行约束,规定必须包含特定属性。

interface hasLength {
    length:number
}
function getLength<T extends hasLength>(arg:<T>):<T>{
    return arg
}

这样就可以记录参数属性的类型。

还可以避免调用时出错,进行强制约束:

function getAnimalProperty<O, K extends keyof O>(obj: O, key: K){
    return obj[key]
}

const bird = {
    name:'bird',
    food:'pest',
}
const birdFood = getAnimalProperty(bird, 'food')

这样就能保证传入的属性一定是存在于对象上的。