function echo<T>(arg:T):T{ return arg } const result = echo("str") function swap<T,U>(arr:[T,U]):[U,T]{ return [arr[1],arr[0]] } const result1 = swap(["str",123]) interface IWidthLength{ length:number; } function echoWidthLength<T extends IWidthLength>(arg:T):T{ console.log(arg.length) return arg } const str = echoWidthLength("str") const str1 = echoWidthLength({length:10}) const str2 = echoWidthLength([1,2,3]) class Queue<T> { private data =[]; push(item:T){ return this.data.push(item) } pop():T{ return this.data.shift() } } const queue = new Queue<string>() // queue.push(1) queue.push("str") console.log(queue.pop().length) interface KeyPair<T,U> { key:T; value:U; } let kp1 : KeyPair<number,string> = {"key":123,value:"str"} interface IPlus<T>{ (a:T,b:T):T } function plus(a:number,b:number):number{ return a+b } function connect(a:string,b:string):string{ return a+b } const a :IPlus<number> = plus const b :IPlus<string> = connect