泛型:
提高程序的安全性和复用性
1. 泛型基本用法
function add<T>(arg1:T,arg2:T):T{
return arg1 + arg2;
}
add<string>('1','5');
add<number>(2,4)
2. 泛型接口用法
方式一:
function add<T>(arg1:T,arg2:T):T{
return arg1 + arg2;
}
let addFunc:<T>(arg1:T,arg2:T) => T;
addFunc = add
方式二:
function add<T>(arg1:T,arg2:T):T{
return arg1 + arg2;
}
interface GenAdder {<T>(arg1:T,arg2:T) : T};
let addFunc: GenAdder
addFunc = add;
addFunc<number>(3,4)
方式三:
function add<T>(arg1:T,arg2:T):T{
return arg1 + arg2;
}
interface GenAdder <T> {(arg1:T,arg2:T) : T};
let addFunc: GenAdder<number>
addFunc = add;
addFunc(3,4)
3. 泛型类用法
class Adder<T>{
add:(arg1:T,arg2:T) => T
}
function add(arg1,arg2){
return arg1 + arg2;
}
const adder = new Adder<number>();
adder.add = add
adder.add(1,2)
const stringAdder = new Adder<string>();
stringAdder.add = add;
stringAdder.add('2','4')
4. 泛型约束
例子1:
interface ILength{
length: number
}
function getLength<T extends ILength>(arg:T):T{
console.log(arg.length)
return arg;
}
getLength<boolean>(false); //报错
getLength<string>('haha'); //正确
例子2:
function getProperty<T,K extends keyof T>(obj:T,key:K){
return obj[key];
}
//keyof
const persion = {name:'p',age:15};
let keys: keyof typeof persion; // keys: "name" | "age"
getProperty(persion,'age')