我有A类组件:
lst <- strsplit(df$group, "")
i1 <- cbind(rep(seq_len(nrow(df)), lengths(lst)), as.integer(unlist(lst)))
df$total <- ave(df[-5][i1], i1[,1], FUN = sum)
还有包含方法class A {
public do() {
}
public go() {
this.set<A>(this);
}
}
的类B
:
set()
为什么我无法访问方法class B {
public set<T>(e: T) {
e.do(); // Why I can not get access to method `do()`?
}
}
?
答案 0 :(得分:5)
set<T>(e: T)
是通用的。它对T
可以传入什么一无所知。您可以将通用约束更改为T extends A
或T extends SomethingThatHasDo
,然后它将知道do
方法。例如:
class B {
public set<T extends A>(e: T) {
e.do(); // Why I can not get access to method `do()`?
}
}
我建议reading the documentation关于泛型可以做什么和不能做什么。
答案 1 :(得分:1)
TypeScript阻止您调用.do()
,因为e
的类型可以是任何类型。例如,执行new B().set(5);
会导致运行时错误,因为5.do()
不存在。
如果要接受e
的任何类型,则应在调用A
之前检查传入的对象是否为.do()
类型:
class B {
// do you really need to use a type parameter here?
// Maybe just make it unknown as shown:
set(e: unknown) {
if (e instanceof A)
e.do(); // ok
}
}
或者使用do
方法检查它是否是对象:
class B {
set(e: unknown) {
if (hasDo(e))
e.do(); // ok
}
}
function hasDo(obj: any): obj is { do(): void; } {
return typeof obj.do === "function";
}
或通过仅接受类型为A
的参数来限制传入的对象为类型A
:
class B {
set(e: A) {
e.do();
}
}