abc中下面一行中的通用部分是<> 。
实际上,因为我在角度2中从Javascript端到Typescript端。
这就是为什么我没有在Javascript中看到这些通用部分。
export interface Animals<abc>
export class WaterAnimal <abc> implements Animals<abc> { }
我得到的东西:
例如: -
function identity<T>(arg: T): T {
return arg;
}
我想问的事情: -
当我们进入类和接口时: - 通过传入参数 界面如动物界面的目的是什么。
如果有任何目的我还不知道,现在如果我们将动物接口实现为 WaterAnimal 类,那么我想写{ {1}} 动物接口前面,因为在定义接口时我将该事物作为参数传递给它。为什么编译器强迫我用 WaterAnimal <定义<abc>
/ strong> Class ..这背后有任何原因..
任何帮助将不胜感激。
答案 0 :(得分:2)
语言本身就存在一个很好的泛型例子。
大多数语言都有未打字列表上的表单,例如JavaScript数组:
var arr = [
1,
"str",
new Customer()
];
但是一个更有用的对象是一个只包含单个类型的数组 - 因为那样你可以知道所有内容都是相同的迭代数组:
var arr: NumberArray = [
1,
3,
5
];
但我们需要为每种数组创建一个新类型,因此我们最终会得到NumberArray
,StringArray
,CustomerArray
等等。
因此,我们不是创建几乎无限数量的类型,而是创建一个通用类型。然后我们指定我们打算使用的类型:
var arr: Array<number>= [
1,
3,
5
];
类型参数(number
)允许我们重用Array类或接口,而不是创建新类型。这个条件是除非我们指定一个类型约束,否则Array不能知道这个类型。
要理解如何在泛型类中使用它,这是一个快速的假例子:
class ArrayOfOne<T> {
private item: T;
add(item: T) {
this.item = item;
}
retrieve() : T {
return this.item;
}
}
在此示例中,ArrayOfOne
类不需要知道T
是什么,但如果您使用它,T
将被强类型化。
var arr = new ArrayOfOne<string>();
arr.add("str"); // ok
arr.add(1); //not ok
var str: string = arr.retrieve(); // ok
var num: number = arr.retrieve(); // not ok