function createArray<U>(len: number, val: U) {
let result = [] as U[]
for (let i = 0; i < len; i++){
result.push(val)
}
return result
}
createArray<100>(3, 100)
const createArray = <U>(len: number, val: U) => {
let result = [] as U[]
for (let i = 0; i < len; i++){
result.push(val)
}
return result
}
createArray<100>(3, 100)
function swap<T,K>(tuple:[T,K]):[K,T] {
return [tuple[1],tuple[0]]
}
swap([1, 'a'])
1. IFun<T> 表示使用接口的时候确定类型
interface IFun<T>{
(a:T,b:T):T;
}
let fun:IFun<number> = (a,b)=>{return a+b};
fun('1','2')
2. <T>():void 表示使用函数的时候传入类型
interface IFun {
<T>(a: T, b: T): void;
}
let fun: IFun = <T>(a: T, b: T) => { console.log(a,b) };
fun(1,2)
案例2:
type ICallback<T> = (item: T, index: number) => void
type IForeach = <T>(arr: T[], callback: ICallback<T>) => void
const forEach: IForeach = (arr,callback) => {
for (let i = 0; i < arr.length; i++){
callback(arr[i],i)
}
}
forEach([1, 2, '3', 4, 5], (item) => {
})
type ICallback = <T>(item: T) => void
type IForeach = <T>(arr: T[], callback: ICallback) => void
const forEach: IForeach = (arr,callback) => {
for (let i = 0; i < arr.length; i++){
callback(arr[i])
}
}
forEach(['1',2,'3'],(item) => {
console.log(item)
})
type IUnion<T = boolean> = T | string | number
type t1 = IUnion
type t2 = IUnion<string[] | number[]>
function handle<T extends string>(val:T):T {
return val
}
handle('abc')
interface IWithLen{
length:number
}
function handle<T extends IWithLen>(val:T) {
console.log(val.length)
}
handle({
a: 1,
b: 2,
length: 2
})
class MyList<T extends string | number = number> {
arr: T[] = [];
add(val: T) {
this.arr.push(val);
}
}
const list = new MyList<number>()
list.add(1)
function getValue<T>(obj:T,key:keyof T) {
return obj[key]
}
getValue({
name: '章',
age:18
}, 'name')
function getValue<T extends { name: string; age: number }>(obj: T, key: keyof T): T[keyof T] {
return obj[key];
}