即便是类型也可以更灵活,使函数更具有通用性,这是由于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')
这样就能保证传入的属性一定是存在于对象上的。