2014-06-19 75 views
2

是否可以调用类型参数的静态方法?例如,我有以下代码:如何在TypeScript中调用类型参数的静态方法

class BaseA1 { 
    public static getString(): string { 
    return "A1"; 
    } 
} 

class A<A1 extends BaseA1> { 
    constructor() { 
    var name = A1.getString(); // <== error [the property getString does not exist ...] 
    } 
} 

如何正确调用静态方法?有没有可能,如果不是什么可能是最好的替代方法?谢谢,亲切。

+0

这是一个很好的平衡,但是因为这纯粹涉及到TypeScript的类的东西,根本不涉及JavaScript,所以我删除了'javascript'标记。 (许多TypeScript问题也适用于'javascript'标签,但是当问题纯粹是关于TypeScript语言功能的时候,这不适用。) –

+0

好问题,顺便说一句,并且问得很好。 –

回答

2

静态方法属于类类型,而不属于实例。特别是,如果A1定义了它自己的getString,它不会是一个重写的方法,而是一个阴影方法。

所以你想要做的唯一场景是有意义的,当你想依赖一个类型从它的基类型中映射一个方法。然而,这将是非常臭的代码(换句话说:不要这样做)。

要么调用BaseA1.getString(),要么如果您需要在子类中重写它的方法,请将它作为适当的实例方法。看到你的例子返回子类的名字,我倾向于认为你试图达到某种可疑的目的,并且建议你就你想解决的根本问题提出另一个问题,而不是问如何使问题成为问题目前的设计工作。

您可以在这个here找到解释;这是关于Java而不是Typescript,但这个想法是一样的。

+0

tldr;静态属于BaseA1,一个已知的类型,所以为什么要从A1调用? – x0n

+0

@ x0n:如果它被所使用的具体类型遮蔽,因为'constructor'是特定于实例的,并且具体类型是已知的。这个问题非常有意义,并且有一个处理它的论据(同样,只在特定于实例的代码中)。 TypeScript显然没有,Java也没有(Java会编译它,但是调用BaseA1的版本),但是在很高的层次上这个问题是非常合理的(在Typescript中比在Java中更合理,因为TypeScript更具动态性,但可能合理都)。 –

+0

这是coindings(谈论子类的名字)。返回字符串可能是任何内容。也许,我正在编写一个MVC模式的模型层,每个类代表一个实体。所有实体的根父类都有一个静态方法,它返回数据库中表的名称。这个方法应该在descedants中重写。情况就是如此。 –

相关问题