gpt4 book ai didi

typescript - 在 TypeScript 中多态 this

转载 作者:搜寻专家 更新时间:2023-10-30 20:58:00 24 4
gpt4 key购买 nike

我正在尝试做我认为是多态 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com