- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
It is only the ts annotation problem, in js runtime works everything as expected.
对于多重继承/混合,我们有一个运行时方法,它接受类/对象并创建复合(混合)类。
class A {
a: string
static staticA: string
}
class B {
b: string
static staticB: string
}
class C extends mixin(A, B) {
c: string
static staticC: string
}
所以我们的 mixin
方法创建了 C
的混合类继承。现在我们有一些注释问题。简单 mixin
声明看起来像这样(实际上,mixin
也接受 T1
和 T2
的对象,但为了简单起见,我从代码中删除了它):
interface Constructor<T = {}> {
new (...args: any[]): T;
}
declare function mixin<T1 extends Constructor, T2 extends Constructor> (
mix1: T1,
mix2: T2
): new (...args) => (InstanceType<T1> & InstanceType<T2>)
不幸的是,mixin
返回的类型松散 T1
的静态方法和 T2
.
C. /* only 'staticC' is present in autocomplete */
let c = new C;
c. /* all - 'a', 'b' and 'c' are present in autocomplete */
我还尝试返回类型 T1 & T2
, 但在 mixin(A, B)
中得到错误
[ts] Base constructors must all have the same return type.
有什么解决办法吗?
感谢@titian-cernicova-dragomir。我在这里添加我的最终解决方案,我扩展了注释以支持对象,而不仅仅是类,希望它对某些人有所帮助。
// Extract static methods from a function (constructor)
type Statics<T> = {
[P in keyof T]: T[P];
}
declare function mixin<
T1 extends Constructor | object,
T2 extends Constructor | object,
T3 extends Constructor | object = {},
T4 extends Constructor | object = {},
> (
mix1: T1,
mix2: T2,
mix3?: T3,
mix4?: T4,
):
(T1 extends Constructor ? Statics<T1> : {}) &
(T2 extends Constructor ? Statics<T2> : {}) &
(T3 extends Constructor ? Statics<T3> : {}) &
(T4 extends Constructor ? Statics<T4> : {}) &
(new (...args: T1 extends Constructor ? ConstructorParameters<T1> : never[]) =>
(T1 extends Constructor ? InstanceType<T1> : T1) &
(T2 extends Constructor ? InstanceType<T2> : T2) &
(T3 extends Constructor ? InstanceType<T3> : T3) &
(T4 extends Constructor ? InstanceType<T4> : T4)
);
class A {
a: string
static staticA: string
}
class B {
b: string
static staticB: string
}
const Utils = {
log () {}
}
class C extends mixin(A, B, Utils) {
c: string
static staticC: string
}
C. // has 'staticA', 'staticB', 'staticC'
let c = new C;
c. // has 'a', 'b', 'c', 'log'
我还添加了第一个类的构造函数(如果有)的参数支持。
...args: T1 extends Constructor ? ConstructorParameters<T1> : never[]
.
不幸的是,我找不到制作 mixin
的解决方案注释以支持任意数量的参数,目前我做了 4 个,因为这对我的情况来说已经足够了。虽然我们的 js mixin
可以接受任意数量的类/对象来创建混合类。
最佳答案
你可以保持原创mixin
按原样运行,并与返回的构造函数相交 T1
和 T2
class A {
a!: string
static staticA: string
}
class B {
b!: string
static staticB: string
}
class C extends mixin(A, B) {
c!: string
static staticC: string
}
interface Constructor<T = {}> {
new(...args: any[]): T;
}
declare function mixin<T1 extends Constructor, T2 extends Constructor>(
mix1: T1,
mix2: T2
): {
new(...args: any[]): (InstanceType<T1> & InstanceType<T2>)
} & T1 & T2
C.staticA
C.staticB
C.staticC
let c = new C;
c.a
c.b
c.c
你提到你试过 T1 & T2
该方法的问题在于不会更改构造函数以返回 (InstanceType<T1> & InstanceType<T2>)
.您必须将这个新签名添加到构造函数和原始类中。
关于typescript - 类型注释 : How to inherit from a Mixin of several classes and preserve static methods?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53191711/
所以`MKAnnotation's。有趣的东西。 我的问题: 注释的标题和副标题有什么区别?这对注释的视觉组件有何影响? MKPinAnnotationView 和 MKAnnotationView
我正在使用 JBoss 工具将 DB 模式反向工程到 POJO 中。具体来说,我在 hibernatetool ANT 任务中使用了 hbm2java 选项。在 hbm2java 选项下,您可以指定
假设我有这段文字: cat file /* comment */ not a comment /* another comment */ /* delete this * /* multiline
我明白,如果你///在类、字段、方法或属性上方 Visual Studio 将开始为您建立 XML 样式的注释。 但是,我在哪里可以为我的命名空间和/或库添加 XML 注释... 例如: .NET F
int API_VERSION = 21; @TargetApi(API_VERSION)在Android中用于指定该方法/类支持API_VERSION及以下。 我们是否可以镜像类似的东西,指定仅支持
Closed. This question needs to be more focused。它当前不接受答案。
假设我有一个界面如下。 public interface MyInterface{ /** * This method prints hello */ void sayHello();
我已将 Jboss 应用程序迁移到 WebSphere Liberty。我必须删除所有 Jboss 引用库。在这样做的同时,我在某些注释中面临问题。 Jboss 应用程序使用 @SecurityDom
在本教程中,您将了解 JavaScript 注释,为什么要使用它们以及在示例的帮助下如何使用它们。 JavaScript 注释是程序员可以添加的提示,以使代码更易于阅读和理解。JavaScri
我正在建立一个博客,为了发表评论,我有这个 CSS。 #comments { position:absolute; border: 1px solid #900; border-width: 1
我正在尝试在单元格中插入评论。我正在尝试按照代码进行评论,但它没有在创建的 excel 中显示评论。我正在创建 .xls 扩展名。 $objPHPExcel->getActiveSheet()->ge
我正在使用 TS 在 MarionetteJS 上编写项目,我想使用注释来注册路由。例如: @Controller class SomeController { @RouteMapping("so
我有一个应用程序可以在页面上生成大量注释。用户可以单击页面上的任意位置以创建快速注释(例如 Acrobat Pro)可以在一般 中使用一些 javascript 行添加和删除这些注释
是否有 JavaScript 注释? 当然 JavaScript 没有它们,但是是否有额外的库或建议的语言扩展,例如 @type {folder.otherjsmodule.foo} function
Java 中注解的目的是什么?我有一个模糊的想法,认为它们介于注释和实际代码之间。它们在运行时会影响程序吗? 它们的典型用法是什么? 它们是 Java 独有的吗?有 C++ 等价物吗? 最佳答案 注解
其实我们在 Ruby 基础语法 已经比较详细的介绍了 Ruby 语言中的注释 Ruby 解释器会忽略注释语句 注释会对 Ruby 解释器隐藏一行,或者一行的一部分,或者若干行。 Ruby 中的注
我正在 try catch VBA 注释。到目前为止,我有以下内容 '[^";]+\Z 它捕获以单引号开头但在字符串结尾之前不包含任何双引号的任何内容。即它不会匹配双引号字符串中的单引号。 dim s
有没有办法在'svn commit'上将提交注释添加到更改的文件中。有人告诉我有一种方法可以用 cvs 做到这一点,但我们使用 svn。目前,我们使用“$Revision”关键字将修订号添加到更改的文
我正在尝试通过 ManyToMany 注释自动对报告的结果进行排序 @OrderBy : /** * @ORM\ManyToMany(targetEntity="Artist", inversedB
我正在使用 JBoss 5 GA,我创建了一个测试 session bean 和本地接口(interface)。我创建了一个 servlet 客户端。我尝试使用 @EJB 将接口(interface)
我是一名优秀的程序员,十分优秀!