ts:泛型函数(T)
一、主要内容说明
泛型有几个,有T(type)、V(vuale)、E(element)、U、R等。本文用T,当然T也是泛型中最常使用的。ts中,我们泛型T我们可以把它当成一个类,这个类里包含string、number等多种类,当程序运行时,它会根据我们输入的参数自动判断为某一种类型。如我们,分别输入数值、字符串、日期类型的参数后,泛型可以自动判断我们输入的数值、字符串、日期类型参数,然后分别输出数值、字符串、日期的函数变化后的内容。通常情况下的函数,想输出数值,需要专门设置好输出的类型为number。想输出字符串,需要专门设置好输出的类型为string。想输出或输入日期类型,需要设置好输出或输入的类型为Date。函数泛型之外,还有泛型接口,泛型类,泛型约束等,本文只是列举了泛型函数的简单创建和使用,其他泛型内容会按需要另起博文。
对比泛型函数和其他正常函数的区别,把他们的创建模式放一起,以对比差异。
function mes<T>(arg: T): T {
return arg; // 返回传入的参数
}
// 普通函数,接受字符串参数
function mes_2(arg_2: string): string {
return arg_2; // 返回传入的字符串
}
// 定义另一个普通函数,接受数字参数
function mes_3(arg_3: number): number {
return arg_3; // 返回传入的数字
}
通过上例,第一个函数mes为泛型。它可以传入和传出大部分类型参数,如number、string、Date等。而第二个函数mes_2,只接收和传出string字符串类型,如果将传入的类型变为number数值类型,则报错。同样的,第三个函数mes_3,只接收和传出number类型,如果传入的类型为string字符串类型,则也报错。但对于第一个函数mes,泛型的,它可以接受string的同时也接收number的类型,甚至还可以接收date时间等等的类型。
二、例子
(一)、泛型函数的创建
1.源码1泛型函数的创建
// 定义一个泛型函数
function mes<T>(arg: T): T {
return arg; // 返回传入的参数
}
// 使用泛型
const num = mes<number>(764); // 返回类型为 number
console.log(num); // 输出: 764
const str = mes<string>("Hello"); // 返回类型为 string
console.log(str); // 输出: Hello
2.源码1运行效果
(二)、泛型与其他类型参数的对比
1.源码2
// 定义一个泛型函数
function mes<T>(arg: T): T {
return arg; // 返回传入的参数
}
// 普通函数,接受字符串参数
function mes_2(arg_2: string): string {
return arg_2; // 返回传入的字符串
}
// 定义另一个普通函数,接受数字参数
function mes_3(arg_3: number): number {
return arg_3; // 返回传入的数字
}
console.log("\n分隔行-------------------------------------\n");
// 调用 mes_2,传入字符串
const str2 = mes_2("字符串元素"); // 返回类型为 string
console.log("string类输出:" + str2); // 输出: 字符串元素
// 使用泛型函数 mes 代替 mes_2,传入字符串
const str3 = mes<string>("字符串元素"); // 返回类型为 string
console.log("泛型输出:" + str3); // 输出: 字符串元素
// 以下行代码将会报错,因为 num2 的类型不匹配
// const num2 = mes_2(766); // 报错:类型 'number' 不能赋值给参数类型 'string'
console.log("\n分隔行-------------------------------------\n");
// 调用 mes_3,传入数字
const num3 = mes_3(767); // 返回类型为 number
console.log("number类输出:" + num3); // 输出: 767
// 以下行代码将会报错,因为 num5 的类型不匹配
// const num5 = mes_3("字符串元素"); // 报错:类型 'string' 不能赋值给参数类型 'number'
// 使用泛型函数 mes 代替 mes_3,传入数字
const num4 = mes<number>(767); // 返回类型为 number
console.log("泛型输出:" + num4); // 输出: 767
console.log("\n分隔行-------------------------------------\n");
// 创建两个 Date 对象
const date_1 = new Date("2024-10-28"); // 使用 ISO 8601 格式的日期字符串
const date_2 = new Date(2008, 8, 8); // 注意:月份是从 0 开始的,因此 8 表示 9 月
// 使用泛型函数 mes 处理 Date 类型
const num5 = mes<Date>(date_1); // 返回类型为 Date
const num6 = mes<Date>(date_2); // 返回类型为 Date
// 输出 Date 对象
console.log("泛型输出:" + num5); // 输出: 2024-10-28T00:00:00.000Z
console.log("泛型输出:" + num6); // 输出: 2008-09-08T00:00:00.000Z
2.源码2运行效果
三、结语
泛型和any类很相似。但any这一类,鸿蒙开发新版本开放后已不允许命名使用,那后面则不考虑不使用any类的创建。泛型用到的领域范围并不大。
我曾经问老师,如果我们跑路了是不是可以用泛型设置参数,让程序变乱。老师说想如此,还是得用any类,因为它早晚会报错,且不好维护和修复,而泛型反而是优化了代码。
ts和js一样只是鸿蒙开发的基础,过完ts这一段便进入到arkts的学习中。但这也无关紧要,它们的逻辑思想非常相似。各语言都有它自己专门的领域,并无好坏之分,重要的还得是运用它们的人。
由于笔者的能力有限,创作的内容有所不足在所难免,也敬请读者包涵和指出,万分感谢!
四、定位日期
源码内容输入完毕,文字说明今天再继续。
2024-10-28;
23:37;
2024-10-29;
12:03;