我是打字稿的新手,而不是之前的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");
任何建议都将不胜感激。 谢谢
答案 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
。
使用泛型,编译器知道output
是string
。
答案 2 :(得分:0)
在这种情况下,使用泛型比使用 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
}
这证明在这种情况下,使用泛型要比使用任何类型的安全得多:)。