# 泛型

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

使用泛型约束上面函数

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
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

泛型在类型定义中的使用

泛型定义函数类型

let getArray3: <T>(arg:T, times: number) => T[]
getArray3 = (arg: any, times: number) => {
	return new Array(times).fill(arg)
}
1
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

使用接口定义

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

泛型约束,简单来说就是对泛型变量的条件限制

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

在泛型约束里使用类型参数

// 在泛型约束里使用类型参数
// 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