# 泛型
WARNING
- 简单使用
- 泛型变量
- 泛型类型
- 泛型约束
- 在泛型约束中使用类型参数
泛型的简单使用
let getArray = (value: any, times: number = 5): any[] => {
return new Array(times).fill(value)
}
console.log(getArray(2, 3).map(item => item.length))
// [undefined, undefined, undefined] // 数值是没有length
1
2
3
4
5
6
7
2
3
4
5
6
7
使用泛型约束上面函数
let getArray = <T>(value: T, times: number = 5): T[] => {
return new Array(times).fill(value)
}
// 此时会提示 没有 length
console.log(getArray<number>(2, 3).map(item => item.length))
1
2
3
4
5
6
7
2
3
4
5
6
7
let getArray2 = <T, U>(params1: T, params2: U, times: number): [T,U][] => {
return new Array(times).fill([params1, params2])
}
console.log(getArray2(1, 'a', 2))
1
2
3
4
5
2
3
4
5
泛型在类型定义中的使用
泛型定义函数类型
let getArray3: <T>(arg:T, times: number) => T[]
getArray3 = (arg: any, times: number) => {
return new Array(times).fill(arg)
}
1
2
3
4
2
3
4
使用类型别名定义
type GetArray = <T>(arg: T, times: number) => T[]
let getArray4: GetArray = (arg: any, times: number) => {
return new Array(times).fill(arg)
}
1
2
3
4
2
3
4
使用接口定义
interface GetArray2 {
<T>(arg: T, times: number): T[]
}
interface GetArray2 <T>{
(arg: T, times: number): T[],
array: T[]
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
泛型约束,简单来说就是对泛型变量的条件限制
interface ValueWithLength {
length: number
}
let getArray5 = <T extends ValueWithLength>(arg: T,times: number): T[] => {
return new Array(times).fill(arg)
}
// 约束只能传带 length 的, 使用继承
getArray5([1, 3], 3)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
在泛型约束里使用类型参数
// 在泛型约束里使用类型参数
// keyof 是索引类型, 可以理解为,把对象的属性名以数组的形式返回了
let getProps = <T, K extends keyof T>(object: T, propName: K) => {
return object[propName]
}
let objs = {
a: 'a-a',
b: 'b-b'
}
getProps(objs, 'a')
// getProps(objs, 'c') // 没有c 这个属性,需要有提示
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11