Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
隐藏超类方法的静态方法的Typescript绑定_Typescript_Overloading_Static Methods - Fatal编程技术网

隐藏超类方法的静态方法的Typescript绑定

隐藏超类方法的静态方法的Typescript绑定,typescript,overloading,static-methods,Typescript,Overloading,Static Methods,在Javascript中,类继承静态方法,但子类方法隐藏同名的超类方法,而不是重载它们。所以你可以做这样的事情: class A { static foo(a) { ... } } class B extends A { static foo(a, b) { ... } } 您可以调用A.foo(A)或B.foo(A,B),它将按照预期的方式运行。不幸的是,Typescript不喜欢这样,它似乎假设与实例方法应用相同的规则,即所有方法都是虚拟的。因此,尝试在.d.ts文件中表示

在Javascript中,类继承静态方法,但子类方法隐藏同名的超类方法,而不是重载它们。所以你可以做这样的事情:

class A {
    static foo(a) { ... }
}
class B extends A {
    static foo(a, b) { ... }
}
您可以调用A.foo(A)或B.foo(A,B),它将按照预期的方式运行。不幸的是,Typescript不喜欢这样,它似乎假设与实例方法应用相同的规则,即所有方法都是虚拟的。因此,尝试在.d.ts文件中表示上述内容,如下所示:

export class A {
    static foo(a: string): void
}
export class B extends A {
    static foo(a: string, b: number): void
}

导致错误,因为函数签名不兼容。我可以通过复制
B
A
foo
的声明以及
B
的声明来解决这个问题(.d.ts文件也不需要与两者兼容的实现),但这是个谎言!我是说调用
B.foo(“”
)是可以的,而实际上这是无效的,可能会导致未定义的行为。这引入了“类型危险”,与Typescript的功能相反。是否有其他方法可以在Typescript中正确地表示这些方法,或者至少像注释这样的方法可以在试图调用错误版本的代码中生成警告?这是Typescript中的一个bug吗?

这不是Typescript中的bug,而是一个支持静态继承的设计决策

根据in,类的静态端显然有两个不兼容的用例。一组用户希望看到ES6规范指定的静态继承,这意味着他们应该以检查实例继承的相同方式进行检查:如果您不能在需要超类静态属性的地方替换子类的静态属性,那么您就做错了

另一组人不关心静态方面的可替代性。看起来你属于后一组。。。这对你来说太糟糕了,因为TypeScript倾向于前者。如果你看一下GitHub的问题,看起来他们正在研究改变这一点,但最终还是失败了。所以现在,情况就是这样



那你能做什么呢(除了讨论这个问题并给出答案之外,这些都是好主意,但我不认为它们能解决这个特殊问题。这些类需要简单地扩展ie
class MyClass Extendes LibClass
。FWIW我正在为gjs开发ts,目的是使其易于与gjs一起使用Typescript。Javascript实际上是包装器对于支持gobject内省的C库。gobject的API非常适合Typescript,但也有一些类似的头痛问题。好的,那么顶部的部分与相关GitHub问题的链接就构成了您问题的答案:它不是TS中的bug,而解决它的请求功能还没有(还没有?)我没有注意到Typescript处理的对象的接口包括
new(…):A
作为类/构造函数。事情更加复杂,因为GObject通常将构造函数实现为称为
new
的静态函数,因此这些构造函数必须与真正的JS构造函数一起声明。这可以通过语法
new:(…)=>A
完成。