TypeScript泛型函数使用泛型的例子:TypeScript泛型使用数组

TypeScript 通用函数

让我们使用泛型创建第一个示例:恒等函数。此函数将返回传递给它的任何值。您可以将此函数视为一个回显命令。如果没有泛型,函数可能如下所示:

function identity(arg: number): number {
    return arg;
}

或者,我们使用 any 类型来定义函数:

function identity(arg: any): any {
    return arg;
}

使用 any 类型会导致此函数接受任何类型的 arg 参数,这会丢失一些信息:传入的类型应该与返回的类型相同。如果我们传入一个数字,我们就知道可以返回任何类型的值。因此,我们需要一种方法使返回值的类型与传递参数的类型相同。在这里,我们使用了类型变量,它是一种特殊的变量,仅用于表示类型而不是值。

function identity(arg: T): T {
    return arg;
}

我们将类型变量 T 添加到标识。 T帮助我们捕获用户传入的类型,比如数字类型,然后我们就可以使用这个类型了。之后我们再次使用 T 作为返回类型。现在我们可以知道参数类型和返回值类型是一样的。

我们将此版本的标识函数称为泛型,因为它可以应用于多种类型。与使用 any 不同,它不会丢失信息,像第一个示例一样保持准确性,传入数字类型并返回数字类型。

我们定义一个泛型函数后,可以有两种使用方式,如下:

首先是传入所有参数,包括类型参数。

let output = identity("myString");  

这里我们明确指定 T 是字符串类型,并将其作为参数传递给函数,使用括号而不是 ()。

第二种方法更常见。使用类型推断,即编译器会根据传入的参数自动帮我们判断T的类型。

let output = identity("myString"); 

注意:我们不必使用尖括号 () 来显式传入类型,因为编译器可以查看 myString 的值并将 T 设置为其类型。类型推断帮助我们保持代码精简和可读。

TypeScript 通用数组

当使用泛型创建像标识这样的泛型函数时,编译器要求您在函数体中正确使用泛型类型。换句话说,您必须将这些参数视为任何类型或所有类型。看看前面的身份示例:

function identity(arg: T): T {
    return arg;
}

如果我们还想打印出 arg 的长度。我们可能会这样做:

function loggingIdentity(arg: T): T {
    console.log(arg.length);  // Error: T doesn't have .length
    return arg;
}

如果我们这样做了,编译器会抱怨我们使用了 arg 的 .length 属性,但是没有地方可以指定 arg 有这个属性。请记住:这些类型变量代表任意类型,因此使用此函数的人可能会传入一个没有 .length 属性的数字。

现在假设我们要对 T 类型的数组进行操作,而不是直接对 T 进行操作。由于我们使用的是数组,所以 .length 属性应该存在。我们可以像创建任何其他数组一样创建这个数组:

function loggingIdentity(arg: T[]): T[] {
    console.log(arg.length); 
    return arg;
}

你可以这样理解loggingIdentity的类型:泛型函数loggingIdentity接收类型参数T和参数arg,它是一个元素类型为T的数组,返回一个元素类型为T的数组。如果我们传入一个数字数组,它会返回一个数字数组,因为此时 T 的类型是数字。这允许我们使用泛型变量 T 作为类型的一部分而不是整个类型,从而增加了灵活性。

我们也可以这样实现上面的例子:

function loggingIdentity(arg: Array): Array {
    console.log(arg.length); 
    return arg;
}

参考

© 版权声明
THE END
喜欢就支持一下吧
点赞122赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容