// 应用泛型之前class DataManager { constructor(private data: string[] | number[]) {} getItem(index: number) { return this.data[index] }}// 应用泛型class DataManager2<T> { constructor(private data: T[]) {} getItem(index: number): T { return this.data[index] }}interface Item { name: string gender?: number}// 泛型继承class DataManager3<T extends Item> { constructor(private data: T[]) {} getItem(index: number): string { return this.data[index].name }}// 泛型类型束缚class DataManager4<T extends string | number> { constructor(private data: T[]) {} getItem(index: number): T { return this.data[index] }}// 匿名函数泛型【如何应用泛型作为一个具体的类型注解】function hello<T>(param: T): T { return param}const fn: () => string = () => '11'const fn2: <T>(param: T) => T = helloconst fn3: <T>() => string = <T>() => { return '123456'}const data = new DataManager(['111'])console.log(data.getItem(0))const data2 = new DataManager2<string>(['222'])console.log(data2.getItem(0))const data3 = new DataManager3([ { name: '豹子头-林冲' }])console.log(data3.getItem(0))const data4 = new DataManager4<string>(['444'])console.log(data4.getItem(0))