typeScript学习-泛型
typeScript学习
泛型
为什么要用泛型?泛型定义。
泛型在类中的应用?封装一个面向对象的 ArrayList 类。
泛型默认值。
泛型约束。
泛型在Vue3 源码中的应用。
exends keyof + keyof 的联合应用。
泛型反向赋值。
具有以下特点的数据类型叫泛型:
特点一:定义时不明确使用时必须明确成某种具体数据类型的数据类型。【泛型的宽泛】
特点二:编译期间进行数据类型检查的数据类型。【泛型的严谨】
// class 类名<泛型形参类型> 泛型形参类型一般有两种表示:1. A - Z 任何一个字母;2. 语义化的单词来表示,绝大多数情况,泛型都是采用第一种形式表示,如下: class ArrayList<T>{ array!: Array<T> add(data: T) { // ... } // ... }
// any 不进行类型检查 interface Ref<V> { value: V } let ref: Ref<string> = { value: "abc" } type Student = { name: string, age: number } let ref2: Ref<Student> = { value: { name: 'wangwu', age: 23 } } console.log(ref2.value.age) // 23 console.log(ref2.value.name) // wangwu
泛型默认值
// 泛型的默认值 class ArrayList<T = any> { arr: Array<T>; index: number = 0 constructor() { this.arr = [] } add(ele: T) { this.arr[this.index++] = ele } get(index: number) { return this.arr[index] } } let arrlist3 = new ArrayList() // 默认值 any export { }
keyof 表示获取一个类或者一个对象类型 或者一个接口类型的所有属性名【key】组成的联合类型。
索引访问类型
泛型约束
class Order { orderid!: number ordername!: string static count: number printOrd() { } static getCount() { } } // 泛型约束 type InstancePropKeys<T extends object> = keyof T // type OrdPropKeys = InstancePropKeys<{ username: 'wangwu' }> type OrdPropKeys = InstancePropKeys<Order> // type OrdIdType = Order["orderid"] type OrdInstanceAttrNames = keyof Order let oian: OrdInstanceAttrNames = "ordername" // let oian: OrdInstanceAttrNames = "count" // 错误
反向为泛型赋值
class ObjectRefImpl<T extends object, K extends keyof T>{ public readonly _v_isRef = true constructor(private readonly _object: T, private readonly _key: K) { } get value() { return this._object[this._key] } set value(newVal) { this._object[this._key] = newVal } } type ObjType = { username: string, age: number } // let obj = new ObjectRefImpl<ObjType, "age">({ username: 'wangwu', age: 25 }, "username") let obj = new ObjectRefImpl({ username: 'wangwu', age: 25 }, "username") console.log("obj.value:", obj.value) // obj.value: 25 export { }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现