- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试做我认为是多态 this
的“教科书”用例,但它不起作用,我就是想不通。假设我有一些可克隆的 abstract
基类,例如:
abstract class X {
abstract clone(): this;
}
现在我想实现一个提供克隆
实现的基类:
class Y extends X {
constructor(private x: number) { super() }
clone(): this { return new Y(this.x + 1); }
}
当我这样做时,我收到一条错误消息,提示 Type Y is not assignable to type 'this'
。我完全糊涂了。我想在这里传达的是类型约束,如果 X
的子类调用了它的 clone
方法,那么你将得到的东西的类型将是相同的到子类型。这不正是多态 this
的用途吗?我在这里做错了什么?
Here is a link在 TypeScript playground 中访问此代码。
最佳答案
我已将 artem 的回答标记为正确答案,因为他似乎是正确的,以 100% 安全的方式确实不可能做到这一点。
但是,有一种方法可以让编译器强制执行我想要的类型约束。所以,我决定包括这个答案,以防它对人们有用。我的方法的唯一缺点是,由于 artem 指出的原因,它有点不安全,即有人可以在不提供 clone
实现的情况下扩展你的类并创建返回值的情况不会真的像您声称的那样。
我的解决方案是只添加类型转换。同样,这通常是不安全的。但是,如果您从不从类(class)中扩展,那么据我所知它可以正常工作。所以我的解决方案是:
class Y extends X {
constructor(private x: number) { super() }
clone(): this {
return new Y(this.x + 1) as this;
}
}
编译here可以看到完整版.
关于typescript - 在 TypeScript 中多态 this,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40575417/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!