Skip to content

泛型

泛型可以在保证类型安全的前提下,让同一套逻辑适配多种类型,常用于函数、接口和类。

泛型函数

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') // string
ts
// 更复杂的定义
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
  }
}

基于 MIT 许可发布