【发布时间】:2018-07-09 20:41:32
【问题描述】:
我想创建一个松散为MyKOArray<T> extends KnockoutObservableArray<T> 的 TypeScript 类。这甚至可能吗?如果是这样,是否有一种紧凑的方法可以做到这一点?
- 我阅读了 Knockout 的 extenders 部分,但它似乎不适用,因为我正在尝试(除其他外)添加
state属性 - 不影响现有的可订阅。 - 我可以列出我尝试过的事情以及它们出错的方式(例如 TS2507、TS2322 等),但我怀疑它们是否会提供信息。作为基线,我相信一些基本细节是:
-
KnockoutObservableArray是一个接口,所以我真的需要“扩展”ko.observableArray(“工厂”功能)。 -
ko.observableArray的签名不正确(即没有new,它处理函数中的初始值而不是constructor方法)。 - 我可以通过构造函数
return ko.observableArray(initial),但无法正确获取原型链(例如,方法不可用)。 - 我可以将 JS 中的 override
@@create转换为return ko.observableArray(initial),但是我很难找到 JS 示例(更不用说有效的 TS 实现了)。
-
- 我还发现了一个类似主题的extremely old discussion。那里的结论是,由于 KO 缺乏原型设计,这是不可能的,但当前的源代码(例如
ko.utils.setPrototypeOfOrExtend)表明这个结论可能已经过时了。 - 我还研究了很多通用的 TS 扩展问题(例如 Can you extend a function in TypeScript?),但没有找到似乎匹配的内容。
===
编辑:为什么?
我正在尝试使用以下模式解耦我的系统(仅记录“有趣的案例”):
- ViewModel 向数据服务发出请求(间接通过类的工厂方法)。数据服务立即返回一个实例(
MyClass或KnockoutObservableArray<MyClass>分别用于 Singleton 或 Collection)。 - 服务以异步方式加载/填充(并管理实时更新)返回的实例。这需要订阅 WebSocket 以获取事件和 REST 调用以加载数据(包括重试的可能性)。
- 服务通过调用实例上的方法(我的模式中的“回调”和“errback”)将其进度传递给实例。
- 这些方法会更新
state属性(即可观察)并可能更新其他内容(例如填充其值或填充可观察的错误消息)。 - UI 询问
stateobservable 以向用户传达加载(和其他活动)的状态。
这在我的单个实例上效果很好。 state 方法被广泛询问(和更新)以确保有效操作。
我想在我的 KOArrays 上复制图案。这样,我可以区分尚未加载的空数组和恰好为空的已加载数组。我还可以在 KOArray 中添加 state 和 error_message 以反映我的实例的行为。
【问题讨论】:
-
您能否添加一个简短的描述,说明您究竟为什么需要这个?在大多数情况下,这听起来不像是一个合理的模式。
标签: typescript knockout.js extends