当前位置:网站首页>TS快速入门-泛型
TS快速入门-泛型
2022-07-07 18:01:00 【温情key】
当我们定义一个变量不确定类型的时候有两种解决方式:
使用any
使用any
定义时存在的问题:虽然知道传入值的类型但是无法获取函数返回值的类型;另外也失去了ts类型保护的优势使用泛型
泛型指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定具体类型的一种特性。
泛型函数
定义一个函数,传入两个参数,第一个参数是任何类型的数据,第二个参数是数量
函数的作用是根据数量产生对应个数的数据,存放在一个数组中
// <>里面传入类型
function getArr<T>(val: T, count: number): Array<T> {
const arr: Array<T> = []; // 也可以这样定义 const arr: T[] = [];
for(let i = 0; i < count; i++) {
arr.push(val)
}
return arr
}
console.log(getArr<string>('温情key', 5)); // [ '温情key', '温情key', '温情key', '温情key', '温情key' ]
// 也可以省略调用时的类型,TS会帮我推断出这个参数的类型
console.log(getArr(true, 3)); // [ true, true, true ]
使用方式类似于函数传参,传什么数据类型,T
就表示什么数据类型,T
也可以换成任意合法字符串。
一个函数也可以定义多个泛型参数
function submit<T, K> (code: T, name: K): T {
console.log(`提交了编号为${
code}的${
typeof code}类型和名称为${
name}的${
typeof name}类型物品`);
return code;
}
submit(123, '兰陵王'); // 提交了编号为123的number类型和名称为兰陵王的string类型物品
submit('SG132', 8848); // 提交了编号为SG132的string类型和名称为8848的number类型物品
泛型接口
在定义接口时, 为接口中的属性或方法定义泛型类型 在使用接口时, 再指定具体的泛型类型
interface Search {
<T, K>(val1: T, val2: K): K
}
const searchHandle: Search = <T, K>(id: T, name: K): K => {
console.log('id' + id + ';' + '名称' + name);
return name
}
searchHandle<number, string>(123, '温情key'); // id123;名称温情key
泛型类
在定义类时, 为类中的属性或方法定义泛型类型 在创建类的实例时, 再指定特定的泛型类型
// 定义泛型类
class Generic<T> {
defaultVal: T;
add: (x: T, y: T) => T;
}
// 创建类实例 - number
const myNum = new Generic<number>();
myNum.defaultVal = 111;
myNum.add = function (x, y) {
console.log(x + y);
return x + y;
}
myNum.add(5, 2); // 7
// 创建类实例 - string
const myStr = new Generic<string>();
myStr.defaultVal = '温情';
myStr.add = function(x, y) {
console.log(myStr.defaultVal + x + y);
return myStr.defaultVal + x + y;
}
myStr.add('k', 'ey'); // 温情key
泛型约束
如果我们直接对一个泛型参数取 length
属性, 会报错, 因为这个泛型根本就不知道它有这个属性
// 没有泛型约束
function fn <T>(x: T): void {
console.log(x.length) // error 类型“T”上不存在属性“length”。
}
我们可以使用泛型约束来实现
interface LengthWise {
length: number;
}
function fn<T extends LengthWise>(x: T): void {
console.log(x.length);
}
/* 需要传入符合约束类型的值,必须包含必须 length 属性: */
// fn(123) // error 类型“number”的参数不能赋给类型“LengthWise”的参数。 因为number没有length属性
fn('温情key'); // 5
边栏推荐
- # 欢迎使用Markdown编辑器
- ASP.NET幼儿园连锁管理系统源码
- Cloud component development and upgrading
- 9 原子操作类之18罗汉增强
- Training IX basic configuration of network services
- J ü rgen schmidhub reviews the 25th anniversary of LSTM papers: long short term memory All computable metaverses. Hierarchical reinforcement learning (RL). Meta-RL. Abstractions in generative adversar
- Throughput
- 力扣 459. 重复的子字符串
- Visual Studio 插件之CodeMaid自动整理代码
- R语言ggplot2可视化:使用ggpubr包的ggdensity函数可视化分组密度图、使用stat_overlay_normal_density函数为每个分组的密度图叠加正太分布曲线
猜你喜欢
LeetCode_ 7_ five
CSDN syntax description
YoloV6:YoloV6+Win10---训练自己得数据集
Sword finger offer II 013 Sum of two-dimensional submatrix
Leetcode force buckle (Sword finger offer 36-39) 36 Binary search tree and bidirectional linked list 37 Serialize binary tree 38 Arrangement of strings 39 Numbers that appear more than half of the tim
Chapter 9 Yunji datacanvas was rated as 36 krypton "the hard core technology enterprise most concerned by investors"
Interpretation of transpose convolution theory (input-output size analysis)
mock. JS returns an array from the optional data in the object array
Detailed explanation of Flink parallelism and slot
Make this crmeb single merchant wechat mall system popular, so easy to use!
随机推荐
831. KMP字符串
The project manager's "eight interview questions" is equal to a meeting
吞吐量Throughout
Kubernetes——kubectl命令行工具用法详解
力扣 88.合并两个有序数组
Automatic classification of defective photovoltaic module cells in electroluminescence images-论文阅读笔记
R语言dplyr包mutate_at函数和min_rank函数计算dataframe中指定数据列的排序序号值、名次值、将最大值的rank值赋值为1
pom. Brief introduction of XML configuration file label function
PMP對工作有益嗎?怎麼選擇靠譜平臺讓備考更省心省力!!!
BI的边界:BI不适合做什么?主数据、MarTech?该如何扩展?
RESTAPI 版本控制策略【eolink 翻译】
A pot of stew, a collection of common commands of NPM and yarn cnpm
R语言ggplot2可视化:使用ggpubr包的ggdensity函数可视化分组密度图、使用stat_overlay_normal_density函数为每个分组的密度图叠加正太分布曲线
[confluence] JVM memory adjustment
How to cooperate among multiple threads
力扣674. 最长连续递增序列
论文解读(ValidUtil)《Rethinking the Setting of Semi-supervised Learning on Graphs》
力扣 912.排序数组
数据孤岛是企业数字化转型遇到的第一道险关
torch.nn.functional.pad(input, pad, mode=‘constant‘, value=None)记录