vue3_04_简单介绍ts的接口、泛型、自定义类型

24 - 回顾TS中的接口、泛型、自定义类型

ts这个东西TMD有什么用处;

引子

image-20240502184624257

第一个,如果你写上面的person对象的时候,name这个单词写错了,是不是没有给你提示的?

第二个,你的这个person对象传递给一个文件,再传递一个文件,经历了一些特殊的处理之后,就又传递给了另外的地方;

然后你再次进行person点属性的时候很有可能就是什么都不出来了;

image-20240502184818687

这个时候就要上TS了;

要求

person有三个属性:id,name,age;

一般做项目都会有一个文件夹叫做types;

image-20240502184927269

问题:为什么文件名字叫做index.ts

因为index.ts这个名字,我们就是看中了index这个名字;

我们去其他地方引入这个玩意的时候,我的引入路径只需要写到/types就可以了,省事一点

矫情;

需求:定义一个接口限制person对象

image-20240502185306874

插曲:暴露export有几种方式?

一共是有三种的;

  • 默认暴露:export default
  • 分别暴露:export
  • 统一暴露

插曲:引入的时候@符号表示的是什么

其实TMD,就是src的目录;

引入的小主意点

image-20240502185557964

看上面的图片,我们直接引入typescript的接口,就会报错;

类似上面的写法是不对的;

不对的;

不对的;

这是为什么呢?

为什么a是可以的,但是PersonInter就是不可以的呢?

这到底是为什么的呢?

这是因为a是一种值;MD的,PersonInter不是值;

所以,提醒我们引入的时候,要用下面的写法:

看看ts接口好用不

image-20240502185801807

你看上面,我们的name拼写错了,直接TMD就飘红了;

好用的好用的;

有人说ts麻烦,但是麻烦就是规范;

上面的ts接口就是限制了一个对象

我有一个list怎么限制?

这个玩意就是泛型;

这个意思就是我有一个personList,它的这个玩意是一个Array,然后里头的每一个元素都是符合PersonInter这种接口的;

大致上就是这个意思;

这不是一个高级的写法;

高级写法 - 自定义类型

image-20240502190527429

换一种写法

image-20240502190540199

这个就是第二种写法的;其实就是数组的另外的一个写法;

<think>嗯,用户想了解 TypeScript 中的。首先,我需要回忆的基本概念。TS 中是用来创建可复用组件的,允许类作为参数,提高代码的灵活性和安全性。用户可能已经知道一些类基础,但想深入。 接下来,用户的应用场景可能是什么?他们可能在写函数或类时需要处理多种数据类,但不想重复代码。比如,一个处理数组或API响应的函数。这时候就能派上用场,避免使用 any 类失去类检查的好处。 用户可能的疑问点包括语法、使用场景、高级用法如约束、默认类等。需要分步骤解释,从简单例子入手,逐步深入。比如先展示没有的问题,再引入解决方案。 要注意用户可能对类参数的理解有困难,需要用类比,比如函数的参数但作用于类。同时,要强调的好处:代码复用和类安全。举例说明,比如 identity 函数,用 any 会丢失类信息,用则保留。 可能还需要提到接口、类中的应用,以及常见工具类如 Partial、Readonly 的实现原理。此外,约束和默认值也是重要部分,比如 extends 和 keyof 的使用,帮助用户处理更复杂的情况。 需要检查是否有常见的错误理解,比如认为会增加运行时开销,但实际上只在编译时起作用。还要提醒类推断的情况,有时候不需要显式指定类参数,编译器会自动推断。 最后,总结使用的最佳实践,比如何时使用,如何保持代码简洁,避免过度使用导致代码难以理解。确保用户不仅知道怎么用,还知道何时用,以及背后的设计理念。</think>好的,我来为您逐步讲解 TypeScript 中的(Generics): # 一、为什么需要? 假设我们要写一个返回参数本身的函数: ```typescript // 使用 any 的写法(不安全) function identity(arg: any): any { return arg } ``` - ✅ 可以接受任意类 - ❌ 丢失了类信息(输入 number 会被推断为 any) # 二、的基本使用 用类变量 `<T>` 解决上述问题: ```typescript // 写法(保持类) function identity<T>(arg: T): T { return arg } // 使用示例 const output1 = identity<string>("hello") // 显式指定类 const output2 = identity(42) // 自动类推断(推荐) ``` - `T` 会捕获传入的类,并在整个函数中保持这个类 - 支持类推断,通常不需要显式指定 # 三、的核心特点 1. **类参数化**:把类当作参数传递 2. **代码复用**:一套逻辑支持多种类 3. **类安全**:编译时进行类检查 # 四、常见应用场景 ## 1. 处理数组 ```typescript function getFirst<T>(arr: T[]): T { return arr[0] } // 使用 const num = getFirst([1, 2, 3]) // number 类 const str = getFirst(["a", "b", "c"]) // string 类 ``` ## 2. 接口中使用 ```typescript interface ApiResponse<T> { code: number message: string data: T } // 使用 const userResponse: ApiResponse<{name: string, age: number}> = { code: 200, message: "success", data: { name: "Alice", age: 30 } } ``` ## 3. 类中使用 ```typescript class Box<T> { private content: T constructor(value: T) { this.content = value } getValue(): T { return this.content } } // 使用 const numberBox = new Box<number>(42) const stringBox = new Box("hello") // 自动推断为 string ``` # 五、高级用法 ## 1. 约束(Generic Constraints) ```typescript interface HasLength { length: number } function logLength<T extends HasLength>(arg: T): void { console.log(arg.length) } logLength("hello") // 5 logLength([1,2,3]) // 3 logLength(123) // 错误:number 没有 length 属性 ``` ## 2. 使用类参数 ```typescript function getProperty<T, K extends keyof T>(obj: T, key: K) { return obj[key] } const person = { name: "Bob", age: 25 } getProperty(person, "age") // 正确 getProperty(person, "email") // 错误:email 不存在于 person ``` ## 3. 默认类参数 ```typescript interface Pagination<T = string> { data: T[] pageSize: number total: number } // 使用默认类 const strPagination: Pagination = { /*...*/ } // 自定义类型 const numPagination: Pagination<number> = { /*...*/ } ``` # 六、最佳实践建议 1. 优先让 TypeScript 自动推断类 2. 当需要类关系时才使用 3. 使用有意义的类参数名称(如 T, U, V 或更具体的名称) 4. 避免过度使用导致代码可读性下降 # 七、常见工具类原理 这些内置工具类都是基于实现的: ```typescript type Partial<T> = { [P in keyof T]?: T[P] } type Readonly<T> = { readonly [P in keyof T]: T[P] } type Pick<T, K extends keyof T> = { [P in K]: T[P] } ``` 通过,我们可以编写类安全且高度复用的代码,这是 TypeScript 类系统中非常强大的特性。建议从简单场景开始实践,逐步掌握更复杂的用法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值