TypeScript基础-泛型

南山隐士 2022年06月25日 24 0

泛型

有时候,我们不明确一个数据的类型的时候, 可以使用泛类, 它可以让数据的类型变得灵活, 你想定义什么类型都可以,这个一般用于 复用但接受不同类型参数并返回对应类型 函数 的时候会很有作用,它不同于any类型, 让其什么类型都可以, 泛类的类型定义由你来决定

使用泛型变量

要创建一泛型, 你需要使用<> 来进行定义

function identity<T>(arg: T): T {
    return arg;
}

上面例子中, 我们使用 泛型变量 T 定义了一个 泛型, 这个T能捕获用户传入的类型, 数值, 字符串等等都可以

console.log(identity(3)) // 返回数值
console.log(identity('YaoJin')) // 返回字符串

上面调用泛型的方法是最为常见的, 我们也可以使用以下的方法

console.log(identity<string>('YaoJin'))

之前我们可以定义数组的时候, 可以规定数组里面的类型, 我们也可以使用数组泛型来定义类型, 我们可以看到泛型灵活性是很大的

function arrIdentity<S>(arg: S[]): S[] {
  console.log(arg.length)
  return arg
}
arrIdentity([1111,111])
arrIdentity(['121212','121212'])

定义一个arrIdentity泛型函数, 并且参数以及返回值为任意类型的数组, 泛型的变量名称不一定是T, 可以有你来决定

泛型类型

泛型不仅可以使用到函数中, 它也可以使用到接口中, 让我们创建一个泛型接口

interface NameFace<T> {
  (arg: T): T
}
function TellName<T>(arg:T): T {
  return arg
}
let myName: NameFace<string> = TellName
console.log(myName('YaoJin'))

我们这里定义了一个接口, 这个接口需要一个 ==泛型函数== 作为检查的类型

并且这个接口是一个==泛型接口==, 我们定义了这个接口的==泛型的类型为string==类型,

这样,就导致了这个接口中的函数需要的泛型也为string

可以看到泛型也可以指定类型的!

泛型类

定义泛型类就是类 后面 使用 <> 定义

class testClass<T> {
  num: T
  constructor(num: T) {
    this.num = num
  }
}

let number = new testClass<number>(1)
let string = new testClass<string>('YaoJin')

需要注意的是, 泛型类只对实例部分起作用

static a:T // error, 静态属性不能引用

泛型约束

我们可以对泛型进行约束, 创建一些约束条件, 让泛型必须满足某些条件, 比如我们创建一个接口, 这个接口需要带有length的属性, 并且让这个泛型去继承这个接口

interface ArrayLength {
  length: number
}

function showLength<T extends ArrayLength> (arg: T):T {
  return arg
}

showLength([1212])

这样,我们就约定了, 用户在使用这泛型的时候, 必须传递带有length属性的数据, 如果传递一个对象, 就会报错

showLength({a: 1})

因为我们传递的对象中没有length这个属性

Last Updated: 2022/06/25 19:14:17
TypeScript基础-接口 TypeScript基础-枚举