TypeScript:在泛型中使用命名空间类型参数

时间:2018-10-11 06:19:04

标签: typescript tslint

我有一个通用方法

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'

似乎点'。'被读为','吗?我应该如何传递类型?

1 个答案:

答案 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