主题
泛型
泛型可以在保证类型安全的前提下,让同一套逻辑适配多种类型,常用于函数、接口和类。
泛型函数
ts
function identity<T>(value: T): T {
return value
}ts
const identityArrow = <T>(value: T): T => {
return value
}ts
const str = identity<string>('a') // string
const num = identity<number>(1) // number
const bool = identity<boolean>(false) // boolean
const str1 = identity('a') // 'a'
let str2 = identity('a') // stringts
// 更复杂的定义
function swap<T, U>(tuple: [T, U]): [U, T] {
return [tuple[1], tuple[0]]
}泛型约束
默认情况下,泛型函数的类型变量可以代表多个类型,这会导致无法访问任何类型属性,比如:当参数为数组类型时,无法获取 length 属性。
ts
// 方式 1:把参数约束为数组
function logLength<T>(value: T[]): T[] {
console.log(value.length)
return value
}ts
// 方式 2:约束 T 必须具备 length 属性
interface HasLength {
length: number
}
function logLengthWithConstraint<T extends HasLength>(value: T): T {
console.log(value.length)
return value
}多个泛型变量
ts
function getProp<T, K extends keyof T>(obj: T, key: K) {
return obj[key]
}泛型接口
ts
interface IFoo<T> {
id: T
}泛型类
ts
class Foo<T> {
id: T
constructor(id: T) {
this.id = id
}
}