首页 > 其他分享 >ts中的泛型

ts中的泛型

时间:2023-08-01 21:55:35浏览次数:32  
标签:string ts value echo 泛型 new class

在 TypeScript 中我们会使用泛型来对函数的相关类型进行约束 这里的函数 同时包含 class 的构造函数 因此 一个类的声明部分 也可以使用泛型 那么 什么是泛型? 如果通俗的理解泛型呐?

什么是泛型

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

通俗的解释 泛型是类型系统中的 参数 主要作用是为了类型的重用 从上面定义可以看出 它只会用函数 接口和类中 它和 js 程序中的函数参数是两个层面的事物 (虽然意义是相同的) 因为 typescript 是静态类型系统 是在 js 进行编译时进行类型检查的系统 因此 泛型这种参数 实际上是编译过程中的运行时使用 之所以称它为参数 是因为它具备和函数参数一模一样的特性

泛型函数

目标:声明一个函数 接收一个参数 接收什么参数返回什么值

function getValue<T>(value: T): T {
	return value;
}

getValue<string>("hello");
getValue<number>(100);

//  泛型实参可以忽略   你传递的参数的类型就是要传递的泛型的类型
echo("hello")

泛型类

需求:通过类创建对象 对象的 key 属性可以是字符串可以是数值 对象的 value 属性可以是 字符串可以是数值

{key: string, value: string}
{key: number, value: number}
class StringKeyValuePair {
	constructor(public key: string, public value: string){}
}

class NumberKeyValuePair {
	constructor(public key: number, public value: number){}
}
class KeyValuePair<K, V> {
	constructor(public key: K, public value: V){}
}

泛型接口

需求:创建 fetch 方法用获取数据 当获取用户数据时 fetch 方法的返回值类型为用户 当获取产品数据时 fetch 方法的返回值类型为产品 不沦是用户数据还是产品数据都要被包含在响应对象中

interface MyUserResponse {
	data: User;
}

interface MyProductResponse {
	data: Product;
}
interface MyResponse<T> {
	data: T | null;
}

function fetch<T>(): MyResponse<T> {
	return {data: null};
}

interface User {
	username: string;
}

interface Product {
	title: string;
}

fetch<User>().data?.username;
fetch<Product>().data?.title;

泛型约束

泛型约束是指对泛型参数的范围进行约束 就是说虽然类型可以被当做参数传递 但是传递的类型不能是随意的想传什么就传什么 通过泛型约束可以限制能够传递的类型的范围

// 限制类型 T 的范围  就是说  T  的类型要么是字符串要么是数值  其他的是不可以的
class StringOrNumberArray<T extends string | number> {
	constructor(public collection: T[]) {}
	get(index: number): T {
		return this.collection[index];
	}
}

new StringOrNumberArray<string>(["a", "b"])
new StringOrNumberArray<number>([100, 200])

// 类型  boolean  不满足约束  string | number
// new StringOrNumberArray<boolean>([true, false]);
function echo<T extends string | number>(value: T): T {
	return value;
}
echo<string>("hello")
echo<number>(100)
echo<boolean>(true)
interface Person {
	name: string;
}

function echo<T extends Person>(value: T): T{
	return value;
}
echo<Person>({name: "张三"})
class Person {
	constructor(public name: string) {}
	
}
class Custom extends Person {}
function echo<T extends Person>(value: T): T {
	return value;
}

echo<Person>(new Person("张三"));
echo<Custom>(new Custom("李四"));
interface Printable {
	print(): void;
}

function echo<T extends Printable>(target: T) {
	target.print()
}
class Car {
	print() {}
}
class Hourse {
	print() {}
}
echo<Car>(new Car());
echo<Hourse>(new Hourse());

继承泛型类

class Store<T> {
	protected _objects: T[] = [];
	add(obj: T) {
		this._objects.push(obj);
	}
}

interface Product {
	name: string;
	price: number;
}
const store = new Store<Product>();
class CompressibleStore<T> extends Store<T> {}
new CompressibleStore<Product>();
clsaa ProductStore extends Store<Product> {}

标签:string,ts,value,echo,泛型,new,class
From: https://www.cnblogs.com/zychuan/p/17599205.html

相关文章

  • Flutter中关于initState()方法注意点
    在Flutter中,initState方法是StatefulWidget的生命周期方法之一,它在创建对应的State对象并插入到树中时被调用。具体来说,initState方法在以下情况下被调用:当一个StatefulWidget第一次被插入到树中时,对应的State对象会被创建,并且initState方法会立即被调用。如果Sta......
  • k8s Service Accounts
    ServiceAccounts介绍服务帐户是一种非人类帐户,在Kubernetes中,它在Kubernetes集群中提供独特的身份。应用程序Pod、系统组件以及集群内部和外部的实体可以使用特定ServiceAccount的凭据来标识该ServiceAccount。此身份在各种情况下都很有用,包括向API服务器进行身份验......
  • TSINGSEE青犀视频汇聚平台EasyCVR多种视频流播放协议介绍
    视频监控综合管理平台EasyCVR具备视频融合能力,平台基于云边端一体化架构,具有强大的数据接入、处理及分发能力,平台既具备传统安防视频监控的能力与服务,也支持AI智能检测技术的接入,可应用在多行业领域的智能化监管场景中。EasyDarwin开源流媒体视频EasyCVR安防监控平台可提供视频监控......
  • pycharm配置webots外部控制器,同时添加多个路径,使得能够使用ROS
    1.先配置pycharm的PojectStructure打开Pycharm-->File-->Settings-->Project:项目名-->ProjectStructure-->+AddContentRoot,添加上会用到的库/opt/ros/melodic/lib/python2.7/dist-packages/usr/local/webots/lib/controller/python39/home/xx/multi-ro......
  • TSINGSEE青犀视频汇聚平台EasyCVR多种视频流播放协议介绍
    视频监控综合管理平台EasyCVR具备视频融合能力,平台基于云边端一体化架构,具有强大的数据接入、处理及分发能力,平台既具备传统安防视频监控的能力与服务,也支持AI智能检测技术的接入,可应用在多行业领域的智能化监管场景中。EasyDarwin开源流媒体视频EasyCVR安防监控平台可提供视频监......
  • 推荐几个优秀的echarts图表网站
    madeapieMCChartppchartmakeapie......
  • TSINGSEE青犀视频开源流媒体播放器EasyPlayer.js播放H.265视频,无法截取快照是什么原因
    TSINGSEE青犀视频的开源流媒体播放器EasyPlayer视频播放器,可支持H.264与H.265视频编码格式,性能稳定、播放流畅,还能支持RTSP、RTMP、HLS、FLV、WebRTC等视频流播放,并且已实现网页端实时录像、在iOS上实现低延时直播等功能。目前TSINGSEE青犀视频的所有视频监控平台均使用的是EasyPla......
  • RTSP流媒体服务器LntonNVR(源码版)平台硬件设备拔电关闭后不能自动重启的问题解决方案
    LntonNVR视频边缘计算网关可以放置在项目现场,7x24小时不间断使用,通电联网即可成功运行,部署操作十分简单。我们在测试时,将LntonNVR注册到服务启动,拔掉硬件设备的电源后,再次恢复供电,发现LntonNVR服务并没有再次启动。对此我们也进行了分析与排查。排查步骤如下:1、首先检查是否已经......
  • POJ - Buy Tickets
    Smiling&Weeping----你看这个人,嘴里说着喜欢我却又让我这么难过DescriptionRailwayticketsweredifficulttobuyaroundtheLunarNewYearinChina,sowemustgetupearly......
  • TS中的Type和Interface
    基本介绍学习内容来源于:https://www.youtube.com/watch?v=Idf0zh9f3qQType与Interface的区别编写方式继承方式Type的优势Interface只能描述对象,而Type还可以描述其他类型如string,number,boolean等Type可以描述联合类型和Interface不行Type在使用UtilityTypes时更......