泛型定义
声明某个类型时,定义的时候无法确定该类型,只有使用后才能知道具体的类型,这个类型就是泛型 泛型实际是一种类型变量,泛型可以起到类型约束的一致性的作用。
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
泛型常见用法
泛型应用于函数(不常用)
函数结合接口和泛型使用(常用)
// 使用可调用注解形式声明一个类型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