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