什么是打字稿中的泛型?

时间:2016-01-27 01:41:03

标签: generics typescript

我是打字稿的新手,而不是之前的c#或java。 所以,即使我阅读官方打字稿网站上的说明,我也真的不明白Generics的实际用途。

以下是Generics的简单示例。在下面这样做有什么好处?

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

var output = identity<string>("myString");

没有Generics,我可以在下面这样做(或者我可以使用Interfaces来确保传递指定的参数。)

function identity(arg: any): any  {
    return arg;
}
var output = identity("myString");

任何建议都将不胜感激。 谢谢

3 个答案:

答案 0 :(得分:4)

离开你的基本例子:

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

参数arg:T)和返回类型: T{之间使用通用 强制执行约束 。这允许编译器从参数推断返回类型,如下所示:

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

let str = identity('foo');
// str is of type `string` because `foo` was a string

str = '123'; // Okay;
str = 123; // Error : Cannot assign number to string

答案 1 :(得分:0)

如果没有泛型,您的var output只能输入为any

使用泛型,编译器知道outputstring

答案 2 :(得分:0)

TypeScript中的泛型

在这种情况下,使用泛型比使用 any 类型更安全。 让我向您展示文件内容:

没有泛型

在下面的代码中,randomElem函数从字符串数组返回字符串。在randomColor函数中,我们将类型更改为数字,但在编译时(或运行时)不会产生任何错误。

randomElem(theArray: any): any {
    return theArray[0]; // returning a string.
}

randomColor() {
    let colors: string[] = ['violet', 'indigo', 'blue', 'green']; // String array
    let randomColor: number = this.randomElem(colors);
}

Without Generics Reference Image

使用泛型

但是当使用通用函数时,如果我们尝试更改类型,则在编译自身时会收到错误消息。

  randomElem<T>(theArray: T[]): T {
    return theArray[0];
  }

  randomColor() {
    let colors: string[] = ['violet', 'indigo', 'blue', 'green']; // String array
    let randomColor: number = this.randomElem(colors); // Produce Error
  }

With Generics Reference Image

这证明在这种情况下,使用泛型要比使用任何类型的安全得多:)。

相关问题