如何通过这种方式访问​​方法?

时间:2018-10-22 15:16:18

标签: javascript typescript

我有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()`? } }

2 个答案:

答案 0 :(得分:5)

set<T>(e: T)是通用的。它对T可以传入什么一无所知。您可以将通用约束更改为T extends AT 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();
    }
}