讲给初学者的typescript泛型

Posted nashaofu在路上

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了讲给初学者的typescript泛型相关的知识,希望对你有一定的参考价值。

什么是泛型呢?

泛型,简单来说就是类型变量。在ts中存在类型,类型如numberstringboolean等,泛型就是使用一个类型变量来表示一种类型,类型值通常是在使用的时候才会设置。泛型的使用场景非常多,可以在函数、类甚至interface中使用。

如:我们编写一个类似lodash.find的方法

function find<T>(items: T[], callback: (item: T, index: number) => boolean): T | undefined { for (let i = 0, length = items.length; i < length; i++) { if (callback(items[i], i)) { return items[i] } }}
const items = [{ a: 1 }, { a: 2 }, { a: 4 }, null ]const result = find(items, (item, index) => item.a === 2)

首先<T>是给函数声明了一个类型变量T,后面要求items是一个T类型的数组,然后后面的callback函数的参数item是一个T类型的变量,index为数字,然后callback返回boolean类型结果,整个find函数返回T类型结果或者undefined

如上,我们就能准确定义函数的每一个参数了,参数与参数,参数与返回结果之间就形成了约束关系

在使用的时候,由于定义了数组的元素必须是同一种类型,所以编译时就会提示错误

如果没有使用泛型,我们就只能使用any定义每一个参数了,如下

function find(items: any[], callback: (item: any, index: number) => boolean): any { for (let i = 0, length = items.length; i < length; i++) { if (callback(items[i], i)) { return items[i] } }}
const items = [{ a: 1 }, { a: 2 }, { a: 4 }, null ]const result = find(items, (item, index) => item.a === 2)

以上代码,ts编译是可以通过的,但很明显是非常不严谨的,对于items的定义就可以很宽泛了,然而使用泛型的时候就限制了只能是某一种类型的数组,这样就可以把可能出现的错误在开发时就找出来

简单总结心得,有不正确的地方还请指正。

欢迎关注我:https://github.com/nashaofu


以上是关于讲给初学者的typescript泛型的主要内容,如果未能解决你的问题,请参考以下文章

前端进阶-TypeScript高级类型 | 泛型约束泛型接口泛型工具类型

TypeScript 入门14.泛型

为啥在 Typescript 泛型中使用 '&'

TypeScript专题之泛型

TypeScript——泛型

TypeScript 中泛型的不安全隐式转换