ts重难点泛型总结

博客主要介绍了泛型相关知识,包括定义返回任意类型的泛型函数,对泛型进行约束,要求入参包含特定属性如 length,还提到可创建入参类型随意搭配的泛型,同时指出数组中 number 类型的两种写法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.泛型 generics 定义返回任意类型的函数

function echo<T>(arg: T): T {
    return arg
}
const res = echo(true)
function swap<T, U>(tuple:[T, U]): [U, T] {
    return [tuple[1], tuple[0]]
}
const result2 = swap(['string', 123])
// result2[1].会弹出提示可以调用这里面的方法

2.约束泛型

// 约束泛型
function echoWithArr<T>(arg: T[]): T[] {
    console.log(arg.length)
    return arg
}
const  arrs = echoWithArr([1,2,43])

3.入参必须包含某种属性 例如下面代码中属性length

interface IWithLength{
    length:number
}
function echoWithLength<T extends IWithLength>(arg: T): T {
    console.log(arg.length)
    return arg
}
const strn = echoWithLength('str')
const obj = echoWithLength({length: 10, width:'afdfa'})
const arr2 = echoWithLength([1,23,4])

4.创建一个泛型 入参可以是各种类型 随意搭配

// 创建一个泛型
interface keyPair<T, U> {
    name: T,
    value: U
}
let key1: keyPair<string, number> = {name:'du', value:234}
let key2: keyPair<string, string> = {name:'sfdf', value: 'fafds'}
let seeTwo: keyPair<number[], Array<string>> = {name: [1,2,2,3,], value:['wrwer','werwe','rewr']}


// 数组中装的是number类型的话 有两种写法: Array 和number[] 都可

<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、付费专栏及课程。

余额充值