以下方法可行,但是.getData()
的返回类型为any
,这不是理想的,因为这是消费者面部API调用。
实际上,这里的返回类型不是any
,而是严格取决于items数组中保存的对象的类型。
反正我可以为这种方法的使用者提供返回类型吗?
class Group<T> {
items: Array<T> = [];
addItem(item: T) {
this.items.push(item);
}
getData(itemIndex: number) {
// Any is T
return (this.items[itemIndex] as any).data;
}
}
class NumberItem {
data: number;
constructor(data: number) {
this.data = data;
}
}
class StringItem {
data: String = "";
constructor(data: String) {
this.data = data;
}
}
let n1 = new NumberItem(3);
let n2 = new NumberItem(4);
let g1 = new Group<NumberItem>();
g1.addItem(n1);
g1.addItem(n2);
console.log(g1.getData(1));
答案 0 :(得分:3)
赋予T
一个上限,使其具有data
属性,则返回类型为T['data']
。这样,在getData
方法内也不需要类型声明。
class Group<T extends { data: any }> {
items: Array<T> = [];
addItem(item: T) {
this.items.push(item);
}
getData(itemIndex: number): T['data'] {
return this.items[itemIndex].data;
}
}
用法:
let n1 = new NumberItem(3);
let n2 = new NumberItem(4);
let g1 = new Group<NumberItem>();
g1.addItem(n1);
g1.addItem(n2);
// result: number
const result = g1.getData(1);