泛型 <T>
有的时候,函数的参数类型不确定,但是参数类型要一致,或者参数类型和返回值类型要一致,可以使用泛型,
泛型格式- - -一对尖括号里面放类型,例如: <T>。里面的 关键字随意,U、K、V 等等都可以,一般常用 T ,代表类型(type)
使用的时候可以不用写传入的 泛型类型,可以根据第一个传入的值的类型,自动推导出 泛型类型,然后使用了后面相同的泛型的都会限制为该类型
示例代码:
// 数组重载
function test1(a:number, b:number):Array<number> {
return [a, b]
}
function test2(a:string, b:string):Array<string> {
return [a, b]
}
// 可以使用泛型,简写
function test3<T>(a:T, b:T):Array<T> {
return [a, b]
}
function test4<T,K>(a:T, b:K):Array<T | K> {
return [a, b]
}
console.log(test3(1, 2));
console.log(test3('1', '2'));
console.log(test3(true,false));
console.log(test4(true,1));
打印结果:
泛型约束:extends、keyof
有些时候需要给泛型添加类型约束,限制是某类型范围下的,不然可能报错该类型没有**操作(extends);
还有获取对象属性值的时候,可以约束键为要操作对象的键名(extends + keyof)
示例代码:
function add<T extends number>(a:T, b:T) {
return a + b
}
console.log(add(1, 2));
interface len {
length: number
}
function test<T extends len>(a:T) {
return a.length
}
console.log(test('花花'));
console.log(test(['花花', '何叶']));
function fn<T extends object, K extends keyof T>(a:T, b:K) {
return a[b]
}
let obj = {
name: '史迪仔',
age: 100
}
console.log(fn(obj, 'name'));
// 将属性设置为可选
interface Data {
name: string,
age: number,
sex: string
}
type Options<T extends object> = {
[Key in keyof T]?:T[Key]
}
type B = Options<Data>
打印结果: