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

TypeScript:在泛型中使用命名空间类型参数,typescript,tslint,Typescript,Tslint,我有一个通用方法 abstract run<T> (options: T): void; 抽象运行(选项:T):无效; 然后在实现中,假设我希望T的类型是命名空间A中的类B run <A.B> (options: A.B) : void 运行(选项:A.B):无效 错误是 Type '<A, B>(options: B) => void' is not assignable to type '<T>(options: T) =>

我有一个通用方法

abstract run<T> (options: T): void;
抽象运行(选项:T):无效;
然后在实现中,假设我希望T的类型是命名空间A中的类B

run <A.B> (options: A.B) : void 
运行(选项:A.B):无效
错误是

Type '<A, B>(options: B) => void' is not assignable to type '<T>(options: T) => void'
Type'(选项:B)=>void'不可分配给Type'(选项:T)=>void'

看起来点“.”被解读为“,”?如何传递类型?

如果一个方法在基类中是泛型的,那么它不能仅为派生类中的一个类型实现。这将破坏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
名称空间A{
导出类B{private x!:string}
}
抽象类Abs{
抽象运行(p:T):无效;
}
类Impl扩展了Abs{
run(p:A.B){}//我们在这里得到了一个我们应该得到的错误,但是如果允许的话,我们会得到下面的错误
}
设a:Abs=newimpl();
a、 运行(“”;//Impl期望A.B,但Abs会让我们通过任何T不好
注意您使用的语法也是错误的,您只能将调用中的协奏类型指定为泛型类型参数,不能在函数/方法声明中使用类型作为类型参数。没有语法,因为它通常没有意义,如上所述

一个好的选择是将泛型类型参数移到类中:

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
名称空间A{
导出类B{private x!:string}
}
抽象类Abs{
抽象运行(p:T):无效;
}
类Impl扩展了Abs{
现在运行(p:A.B){}///好
}
设a:Abs=newimpl();
a、 运行(新的a.B());//类型安全

您显示的不是正确的打字脚本。你能提供一个完整的例子吗?当你运行它时,你不需要使用泛型,因为你说参数[0]是t,所以当你在参数中给它一个泛型类型t和一个不同的类型时,它可能会变得混乱,在这种情况下,你使用相同的类型,所以它应该很好,但看起来很奇怪。顺便说一下,类型名称空间(如.d.ts文件中定义的)对于typescript应该没有问题。你真的是指旧的TypeScript名称空间吗?这是一种不推荐的功能。