博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
⑤TypeScript 泛型
阅读量:3965 次
发布时间:2019-05-24

本文共 2759 字,大约阅读时间需要 9 分钟。

TypeScript


写下博客主要用来分享知识内容,并便于自我复习和总结。

如有错误之处,请各位大佬指出。


泛型:软件工程中,我们不仅要创建一致的定义良好的API,同时也要考虑可重用性。组件不仅能够支持当前的数据类型,同时也能支持未来的数据类型,这在创建大型系统时,为我们提供了十分灵活的功能。

在像C#和Java这样的语言中,就可以使用泛型来创建可重用的组件,一个组件可以支持多种类型的数据。这样用户就可以用自己的数据类型来使用组件。

通俗理解:泛型就是解决 类 接口 方法 的复用性、以及对不特定数据类型的支持。


泛型的定义

首先先来看一下泛型的使用场景。

使用普通函数,它只能返回一个类型的数据。

function getData(value:string):string{
return value;}

使用函数重载,代码冗余很明显。

function getInfo(name:string):string;function getInfo(age:number):number;function getInfo(str:any):any{
if(typeof str === "string"){
return "我是:"+str; }else{
return "我的年龄:"+str; }}

直接使用any,当然可以解决问题。

function getAny(value:any):any{
return value;}

但这么做,首先它和js就无区别了,ts的优势根本没有展现,使用any相当于放弃了类型检查。其次,这么做完全没有任何限制,就算数据传错也不会报错,

这显然不是我们想要的。那现在,我就想在传入number时返回number,同时也可以在传入string时返回string,就需要泛型。

泛型:可以支持不特定的数据类型,实现复用性。

// 这里的T表示泛型,(当然可以用其它字母,推荐T)// 具体什么类型是调用这个方法的时候决定的function getData
(value:T):T{
return value;}console.log(getData
(123));// 泛型相比于any的优势:存在类型检查// 报错:getData
('123');

那么在泛型中需要注意的就是,上面代码中的return时不能给一个具体数据类型的值,因为传进来的数据类型和返回值的数据类型不一定相同,所以会报错。

那我们想改变一下返回值的数据类型,只需要:

function getData
(value:T):any{
return value;}

简例:

class MinClass
{
public list:T[] = []; add(value:T):void{
this.list.push(value); } min():T{
let minNum = this.list[0]; for(let i = 0; i < this.list.length; i++){
if(minNum > this.list[i]){
minNum = this.list[i]; } } return minNum; }}// 制定了T代表numberlet m = new MinClass
();m.add(1);m.add(2);console.log(m.min());// 制定了T代表stringlet s = new MinClass
();s.add('a')s.add('c')console.log(s.min())

泛型接口

使用方法一:

interface ConfigFn{
(value:T):T;}let getData:ConfigFn = function
(value:T):T{
return value;}console.log(getData
('李四'));

使用方法二:

interface ConfigFn
{
(value:T):T;}function getData
(value:T):T{
return value;}let myGetData:ConfigFn
= getData;console.log(myGetData('张三'));

把类作为参数类型的泛型类

// 模拟操作数据库的泛型类class MysqlDb
{
add(info:T):boolean{
console.log(info); return true; }}class User{
username: string; password: string;}let u = new User();u.username = '李四';u.password = '123456';// 类当作参数的泛型类let Db = new MysqlDb
();Db.add(u);class ArtCate{
title: string; desc: string; constructor(params:{
title: string, desc?: string }) {
this.title = params.title; this.desc = params.desc; }}let a = new ArtCate({
title: '标题', desc: '描述'});// 类当作参数的泛型类let Db2 = new MysqlDb
();Db2.add(a);

转载地址:http://cmyki.baihongyu.com/

你可能感兴趣的文章
linux 文件权限
查看>>
一些比较好的golang安全项目
查看>>
HTTP状态码
查看>>
go语言
查看>>
mysql mariaDB 以及存储引擎
查看>>
游戏行业了解介绍
查看>>
linux at 命令使用
查看>>
Go在windows下执行命令行指令
查看>>
inotify
查看>>
inode
查看>>
Shell: sh,bash,csh,tcsh等shell的区别
查看>>
golang ubuntu 配置 笔记
查看>>
vim 常用命令
查看>>
golang 开源项目
查看>>
ubntu 开发服务进程
查看>>
linux 常用命令以及技巧
查看>>
记录1年免费亚马逊AWS云服务器申请方法过程及使用技巧
查看>>
golang文章
查看>>
linux的system () 函数详解
查看>>
在shell脚本的第一行中,必须写#!/bin/bash
查看>>