Generics 使用TypeScript比较泛型函数中的类型

Generics 使用TypeScript比较泛型函数中的类型,generics,typescript,Generics,Typescript,我正在尝试使用TypeScript创建服务存储库 我试图确定指定类型的服务实例是否已注册。下面是一个示例(假设接口存在): 类服务存储库{ 静态RegisteredServices:Array=newarray(); 静态寄存器(服务:T){ //已注册的服务是否已经存在? var existingService=this.RegisteredServices.filter( 功能(项目:iSeries设备){ return(item instanceof T);//类型在运行时在TypeScr

我正在尝试使用TypeScript创建服务存储库

我试图确定指定类型的服务实例是否已注册。下面是一个示例(假设接口存在):

类服务存储库{
静态RegisteredServices:Array=newarray();
静态寄存器(服务:T){
//已注册的服务是否已经存在?
var existingService=this.RegisteredServices.filter(
功能(项目:iSeries设备){

return(item instanceof T);//类型在运行时在TypeScript中被擦除。因此,您需要一些不依赖于类型的运行时机制。下面是一个检查类的name属性的解决方案:

interface IService{}

class ServiceRepository {
    static RegisteredServices: Array<IService> = new Array<IService>();

    static Register<T extends IService>(service: T) {
        // Does a registered service already exist?
        var existingService = this.RegisteredServices.filter(
            function(item: IService) {
                return ((<any>item).name == (<any>service).name); // check
            })[0];

        if (existingService) {
            // Remove it first.
            console.log('removing:',existingService);
            this.RegisteredServices.splice(this.RegisteredServices.indexOf(existingService), 1);
        }

        // Add new service instance.
        this.RegisteredServices.push(service);
    }
}

class Foo implements IService{}
ServiceRepository.Register(Foo);
ServiceRepository.Register(Foo);
接口IService{}
类服务存储库{
静态RegisteredServices:Array=newarray();
静态寄存器(服务:T){
//已注册的服务是否已经存在?
var existingService=this.RegisteredServices.filter(
功能(项目:iSeries设备){
return((item).name==(service.name);//检查
})[0];
如果(现有服务){
//先把它取下来。
log('removing:',existingService);
this.RegisteredServices.splice(this.RegisteredServices.indexOf(existingService),1);
}
//添加新的服务实例。
这个.RegisteredServices.push(服务);
}
}
类Foo实现IService{}
ServiceRepository.Register(Foo);
ServiceRepository.Register(Foo);
name
是命名函数的属性,这是因为类在TypeScript到JavaScript转换中的实现方式


加上filter函数的结果是一个数组。我为您修复了这个问题。

类型在运行时在TypeScript中被擦除。因此您需要一些不依赖于类型的运行时机制。下面是一个检查类的name属性的解决方案:

interface IService{}

class ServiceRepository {
    static RegisteredServices: Array<IService> = new Array<IService>();

    static Register<T extends IService>(service: T) {
        // Does a registered service already exist?
        var existingService = this.RegisteredServices.filter(
            function(item: IService) {
                return ((<any>item).name == (<any>service).name); // check
            })[0];

        if (existingService) {
            // Remove it first.
            console.log('removing:',existingService);
            this.RegisteredServices.splice(this.RegisteredServices.indexOf(existingService), 1);
        }

        // Add new service instance.
        this.RegisteredServices.push(service);
    }
}

class Foo implements IService{}
ServiceRepository.Register(Foo);
ServiceRepository.Register(Foo);
接口IService{}
类服务存储库{
静态RegisteredServices:Array=newarray();
静态寄存器(服务:T){
//已注册的服务是否已经存在?
var existingService=this.RegisteredServices.filter(
功能(项目:iSeries设备){
return((item).name==(service.name);//检查
})[0];
如果(现有服务){
//先把它取下来。
log('removing:',existingService);
this.RegisteredServices.splice(this.RegisteredServices.indexOf(existingService),1);
}
//添加新的服务实例。
这个.RegisteredServices.push(服务);
}
}
类Foo实现IService{}
ServiceRepository.Register(Foo);
ServiceRepository.Register(Foo);
name
是命名函数的属性,这是因为类在TypeScript到JavaScript转换中的实现方式


另外,过滤函数的结果是一个数组。我为您解决了这个问题。

谢谢basarat,是的,我现在正在想办法解决这个问题,记住TypeScript只会帮助构建代码,最终它仍然是POJS:p@basarat的答案中的前两行非常值得记住:
类型在运行时在T中被删除ypeScript。
因此您需要一些不依赖于类型的运行时机制。
谢谢basarat,是的,我现在正在想办法,记住TypeScript只会帮助构建代码,最终它仍然是POJS:p@basarat的答案中的前两行非常好,请始终记住:
类型在t在TypeScript中运行时。
因此您需要一些不依赖于类型的运行时机制。