我有一个通用方法
abstract run<T> (options: T): void;
然后在实现中,说我希望T的类型为名称空间A中的类B。TSLint抱怨是否使用
run <A.B> (options: A.B) : void
错误是
Type '<A, B>(options: B) => void' is not assignable to type '<T>(options: T) => void'
似乎点'。'被读为','吗?我应该如何传递类型?
答案 0 :(得分:0)
如果方法在基类中是泛型的,则不能仅对派生类中的一种类型实现。这将违反OOP原则,因为您不能在期望基类的地方使用派生类:
namespace A {
export class B { private x!: string}
}
abstract class Abs {
abstract run<T>(p: T): void;
}
class Impl extends Abs{
run(p: A.B) { } // We get an error here as we should but if this were allowed we would get the error below
}
let a: Abs = new Impl();
a.run(""); // Impl expects A.B, but Abs will let us pass in any T not ok
注意您使用的语法也是错误的,您只能在调用中将协奏类型指定为泛型类型参数,而不能在函数/方法声明中将类型用作类型参数。对此没有语法,因为如上所述它通常没有任何意义。
一个不错的选择是将泛型类型参数移至该类:
namespace A {
export class B { private x!: string}
}
abstract class Abs<T> {
abstract run(p: T): void;
}
class Impl extends Abs<A.B>{
run(p: A.B) { } // ok now
}
let a: Abs<A.B> = new Impl();
a.run(new A.B()); // type safe