2、TypeScript泛型

本文详细探讨了TypeScript中的泛型在函数参数校验、泛型约束函数、类和类方法中的应用,包括多参数泛型和使用类类型的情况。通过实例演示了如何利用泛型提升代码的灵活性和类型安全性。

在TypeScript中,泛型的作用主要是为了实现类型的约束,常见于类、接口、函数之上,它不仅可以约束基本类型,也可以约束自定义类型;

1、函数参数类型校验

如下函数,要求参数arg必须是number类型,也是对参数的一种约束

function identity(arg: number): number {
    return arg;
}

2、使用泛型约束函数

如下写法要求调用identity函数的时候入参类型和出参类型必须一致,具体说明类型在调用的时候说明

function identity<T>(arg: T): T {
  return arg
}

// 入参是数字,返回的参数也是数字
let num = identity(10)
console.log(typeof num);   // 输出number

// 入参是字符串,返回的参数也是字符串
let str = identity('hello')
console.log(typeof str);   // 输出string

3、泛型类

构建此类对象需要确定一个类型T,并且zeroValue属性的类型和new对象传入类型T一致,
add属性是一个函数,必须包含俩T类型参数,返回值和传入类型T类型一致

class GenericNumber<T> {
    zeroValue: T;
    add: (x: T, y: T) => T;
}

let myGenericNumber = new GenericNumber<number>();
myGenericNumber.zeroValue = 0;
myGenericNumber.add = function(x, y) { return x + y; };

4、泛型约束

函数的参数类型必须具备length属性

interface Lengthwise {
    length: number;
}

// 传入的参数类型必须是Lengthwise的子类
function loggingIdentity<T extends Lengthwise>(arg: T): T {
    console.log(arg.length);  // Now we know it has a .length property, so no more error
    return arg;
}

// 正确调用
loggingIdentity({length: 10, value: 3});

5、多个泛型参数

如果有需要,可以同时约束多个参数的类型使用泛型

function getProperty(obj: T, key: K) {
    return obj[key];
}

let x = { a: 1, b: 2, c: 3, d: 4 };

getProperty(x, "a"); // okay
getProperty(x, "m"); // error: Argument of type 'm' isn't assignable to 'a' | 'b' | 'c' | 'd'.

6、在泛型里使用类类型

class BeeKeeper {
  hasMask: boolean;
}

class ZooKeeper {
  nametag: string;
}

class Animal {
  numLegs: number;
}

class Bee extends Animal {
  keeper: BeeKeeper;
}

class Lion extends Animal {
  keeper: ZooKeeper;
}

function createInstance<A extends Animal>(c: new () => A): A {
  return new c();
}

createInstance(Lion).keeper.nametag;  // typechecks!
createInstance(Bee).keeper.hasMask;   // typechecks!
<think>我们根据用户需求,结合站内引用资料,系统整理TypeScript的相关信息。 注意:由于引用标记在用户输入中已明确(如[^1]),我们在回答中直接使用这些引用标记。 用户需求:了解TypeScript的介绍、使用方法及相关知识。 回答结构: 1. 简介(定义、目的) 2. 为什么需要(解决的问题) 3. 的使用方法(函数、接口、类) 4. 约束(限制类型范围) 5. 参数默认类型 6. 常见应用场景 注意:使用中文回答,按照系统指令要求正确使用行内公式(虽然这个主题可能较少涉及数学公式,但如果有表达式如类型参数等,可以用$...$表示)和独立公式(如果有的话)。 但根据内容,可能较少涉及数学公式,因此主要关注代码示例和文字描述。 同时,在回答末尾生成相关问题。 </think>### TypeScript详解 #### 一、介绍 (Generics)是TypeScript的核心特性,允许在定义函数、接口或类时预先指定具体类型,而是在使用时动态指定类型。这种**参数化类型**机制通过`<T>`语法实现,其中`T`是类型变量(可自定义名称)。的主要价值在于: 1. **代码复用**:编写可适用于多种类型的通用组件[^3] 2. **类型安全**:编译器在编译阶段进行类型检查,避免运行时错误[^3] 3. **灵活性**:保持类型约束的同时支持类型操作[^4] #### 二、基本使用方法 ##### 1. 函数 ```typescript function identity<T>(arg: T): T { return arg; } // 显式指定类型 let output1 = identity<string>("Hello"); // string类型 // 类型推断 let output2 = identity(42); // number类型(自动推断) ``` ##### 2. 接口 ```typescript interface KeyValuePair<K, V> { key: K; value: V; } // 使用 const pair: KeyValuePair<number, string> = { key: 1, value: "Apple" }; ``` ##### 3. 类 ```typescript class GenericQueue<T> { private data: T[] = []; push(item: T) { this.data.push(item); } pop(): T | undefined { return this.data.shift(); } } // 使用 const stringQueue = new GenericQueue<string>(); stringQueue.push("A"); stringQueue.push("B"); ``` #### 三、高级特性 1. **约束**:限制类型参数的范围 ```typescript interface Lengthwise { length: number; } function logLength<T extends Lengthwise>(arg: T): void { console.log(arg.length); } logLength("text"); // 4 logLength([1, 2, 3]); // 3 ``` 2. **默认类型参数** ```typescript function createArray<T = string>(length: number, value: T): T[] { return Array(length).fill(value); } createArray(3, "x"); // string[] createArray<number>(3, 5); // number[] ``` 3. **多类型参数** ```typescript function swap<T, U>(tuple: [T, U]): [U, T] { return [tuple[1], tuple[0]]; } swap([7, "seven"]); // 返回 ["seven", 7] ``` #### 四、应用场景 1. **集合操作**:数组、栈、队列等数据结构的通用实现 2. **API响应处理**:统一处理类型API返回的数据结构 3. **工具函数**:如`map`/`filter`等可复用高阶函数 4. **状态管理**:Redux的Action/Reducer类型定义 5. **React组件**:通用组件Props的类型约束 #### 五、最佳实践 1. 优先使用单字母类型参数(`T`/`U`/`K`/`V`) 2. 当类型关系复杂时,使用`extends`添加约束 3. 避免过度化,保持类型可读性 4. 利用类型推断减少显式类型声明 > 通过TypeScript在保持JavaScript灵活性的同时,提供了强类型语言的可靠性和工具支持,大幅提升大项目的可维护性[^1][^4]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值