Lastor
[Coding] 真煩,邏輯寫好了,確認可以 run,就差 ts 定義要怎麼寫,搞半天搞不定
Lastor
參考這個,另外定義了一組 Events 的 interface,去控制 on 方法的定義
Declaring events in a TypeScript class which extends...
Lastor
但我有另一個 class 想共用同樣的 on 方法,還找不太到招要怎麼寫.....
How to share a TypeScript function definition betwee...
Lastor
如果可以簡單的這樣寫,該有多好
https://imgs.plurk.com/QzO/wLA/vlChStatWIy0ZTKKgXasEuk6sNG_lg.png
doomleika
呃,你可以
interface MyClassA extends FooA {}
Lastor
doomleika : 沒辦法,我要定義 method 的那個 class 是 extends 自其他 Node 模塊的,直接新定義一個 interface 再去延伸,會打架
doomleika
不太懂? typescript interface 甚至可以直接繼承class成為interface
Lastor
我想想,我現在主 class IGReceiver 是延伸自 Node.Events,上面另外定義了 interface 去規範 on 方法有哪些 type
https://imgs.plurk.com/QzO/S8t/pDMKjC4RLQlRxwFbJIelHgtscU4_lg.png
Lastor
我想把這些 on 方法提出來變成共用,給 sub interface IGReceiverRouter
Lastor
但主 class 無法同時延伸 Events 與我自定義的 Listener,這兩者對於 on 方法的定義打架了
doomleika
https://images.plurk.com/1PrUtIkbp2zxzfqwKEVUsJ.png
doomleika
我開個vscode一下
Lastor
最下下策是直接寫兩份一樣的定義,就不共用了
doomleika
https://images.plurk.com/RJVcrBJjvcbSlhKBVjrjW.png
Lastor
doomleika : 我本來也在看這寫法,這問題是把 on 實作出來了,原本 Events 的 on 方法就被蓋掉了,之後去 emit event,接收不到
doomleika
https://images.plurk.com/1PrUtIkbp2zxzfqwKEVUsJ.png
Lastor
而且這樣實質要把 on 定義寫三次,也失去了共用的意義
doomleika
看起來像decorator pattern
Lastor
我昨天 google 好像有查到 C 體系的語言有功能可以處理這種需求,不知道是不是你說的這個 decorator pattern
doomleika
我整理一下我的認知,你現在有一個specialized on function去處理 on beforeEvent 但是只有這個,其他的情況你希望轉交給上層Event class處理事嗎
Lastor
這樣說明可能比較好懂,我做了一個概念類似 Express 的 class,內部整理好不同 type 的 Event,然後 emit 出去。在外面可以簡單的用 on 來接
Lastor
然後我想模仿 Express.Router() 做一個類似克隆的玩意,讓用這個 class 的人,可以拆分 on 方法到別的檔案
doomleika
https://images.plurk.com/76JzK4J2VTBcIJJXYwJz2G.png 這樣呢
Lastor
所以我的這個 Router 理想上是要直接繼承主 Class 的所有 on 定義,但其他 methods 我不希望有
doomleika
> 但其他 methods 我不希望有
那沒辦法了,繼承必須是 is-a的關係
doomleika
鵝,這又看起來有點像adaptor
Lastor
目前看來最暴力的方法,可能還是我乖乖寫兩組定義
Lastor
doomleika : 上面那張圖的做法,我目前測起來,只要把 on 實作出來,他就再也沒能力接到 emit 射出的 event,那個 method 根本沒有被調用
doomleika
第三招就是把你要分開的東西拆成不同subclass/interface,再用mixin的方式組合
Lastor
這樣會變成我還得去翻 Events 把它的 on method 給重寫出來
doomleika
等一下,function overfload可以這樣寫嗎,印象中不能以string literal座分隔
doomleika
oh, 你的callback sigature不一樣
doomleika
https://images.plurk.com/rODFIWkQQGyQAMrU0nVst.png
doomleika
呃,我的tsc不同意這種作法
Lastor
先不考慮另一個 Sub Class 的話,我原本是這樣寫,並沒有把 on 方法實作出來,只有用 interface 去定義
Lastor
https://imgs.plurk.com/QzO/VOa/msy6OXI01T8kz6qrFzxDg5u8RWx_lg.png
Lastor
這樣是可以過的,on 方法本來就是 Events 的功能,只要 extends Events 就可以用了,不需要實作出來
doomleika
https://images.plurk.com/74SUWDZOWtelWcW6PBEt4n.png
Lastor
好像成功了,單獨把 on 裡面的參數拉出來,event 作為 key,callback 作為 value,然後用泛型塞回去,就可以共用了
https://imgs.plurk.com/QzO/jiK/mcNW1RHfOK26DL4hiN4HnrQiPqx_lg.png
Lastor
第二行的 on<T... 那邊的是想定義另一種給 user 可以 custom event 的,可以先無視
載入新的回覆