TS泛型及泛型常见用法

61 阅读1分钟

泛型定义

声明某个类型时,定义的时候无法确定该类型,只有使用后才能知道具体的类型,这个类型就是泛型 泛型实际是一种类型变量,泛型可以起到类型约束的一致性的作用。

type A<T> = T // 泛型定义用<T>,T也可以定义为U、K、V等等
let a:A<string> = 'abc' // 使用时确定了A为string类型
let a1:A<number> = 99
let a2:A<boolean> = true // 可以看出,虽然定义时不知道具体类型,但是使用的时候对数据也起到了约束作用

type B<K,V> = K | V // 双泛型或者多泛型表示联合类型
let b:B<number, string> = 'abc'
b = 3

type C<U=boolean> = U // 泛型默认值
let u:C = true

泛型常见用法

泛型应用于函数(不常用)

2.png

函数结合接口和泛型使用(常用)

// 使用可调用注解形式声明一个类型A<T>,从而约束了函数的参数
interface A<T> {
    (n:T): void,
}

let foo: A<number> = (n:number) => {}
foo('a') // 类型“string”的参数不能赋给类型“number”的参数。ts(2345)
foo(123)

let foo2: A<string> = (n:string) => {} // 由于泛型存在,可以轻松实现复用与扩展
foo2('123')

泛型在类中的使用(常用)

class Student<T> {
    name: T
}
const stu = new Student<string>()
stu.name = 123 // 不能将类型“number”分配给类型“String”。
stu.name = 'abc'

泛型约束

type A = string
function foo<T extends A>(n:T){

}
foo<string>('abc')
foo<number>(123) // 由于使用了泛型约束,泛型只能是A的类型,只能是string