typescript泛型笔记

泛型概述

泛型(Generics)是指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性。

什么时候使用泛型
1.当函数、接口或类处理各种数据类型时
2.当函数、接口或类在多个位置使用该数据类型时


function identity (arg: number): Array<number> {
    return [arg];
}

扩展函数的通用型

function identity<T>(arg: T): Array<T> {
    console.log(typeof arg);
    return [arg];
}

const output1 = identity<string>("str1"); // ['str1']
const output2 = identity<number>(100); // [100]

T代表类型,在定义泛型时通常用作第一个类型变量名 T可以用任何有效的名称替换 且可引入多个类型变量

function identities<T, U>(arg1: T, arg2: U): [T, U] {
    return [arg1, arg2];
}
const output3 = identities<string, number>("hello", 100); // ['hello', 100]

React TS项目中的约定写法

interface IProps {
    name: string;
    id: number;
}
interface IState { 
  //...
}

const someComp: React.FC<IProps> = () => {
    //...
}
class OrderDetail extends React.Component<IProps, IState> {
    //...
}

泛型约束

有时,我们可能希望对每个类型变量接受的类型数量进行限制——这就是泛型约束所做的,使用约束来确保类型属性的存在

// 不确定T是否有length属性,会报错
function identity<T>(arg: T): T {
   console.log(arg.length);
   return arg;
}

interface Lengthwise {
    length: number;
}
function identity<T extends Lengthwise >(arg: T): T {
   console.log(arg.length);
   return arg;
}

使用泛型约束,检验我们传入函数的对象是否存在这个属性,保证运行时不发生错误

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

泛型接口

before1.png

before2.png
after1.png

after2.png

泛型类

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; };
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。