2017-05-09 28 views
2

我想使用TypeScript將強類型事件添加到類EventEmitter系統。使用TypeScript和EventEmitter鍵入事件

目前,我們定義類型,如:

interface TypedMsg<Name, T> { 
    messageType: Name; 
    message: T; 
} 

type TypedMsgFoo = TypedMsg<'FOO', string>; 
type TypedMsgBar = TypedMsg<'BAR', number>; 
type EitherFooOrBar = TypedMsgFoo | TypedMsgBar; 

我想這樣定義一個接口:

interface EventHandler<T extends TypedMsg<any, any> { 
    on: (messageType: T.messageType, handler: (T.message) => void) => void; 
} 

但打字稿不支持提取亞型像T.messageType。有沒有另一種方法來做到這一點?

的最終目標將是確定適當的打字處理程序只:

class FooBarHandler implements EventHandler<EitherFooOrBar> { 
    on(messageType: EitherFooOrBar.messageType) {...} 
} 

回答

3

打字稿不支持提取類型的成員,只是語法有點不尋常 - 這就是所謂的indexed access type operator

interface TypedMsg<Name, T> { 
    messageType: Name; 
    message: T; 
} 

type TypedMsgFoo = TypedMsg<'FOO', string>; 
type TypedMsgBar = TypedMsg<'BAR', number>; 
type EitherFooOrBar = TypedMsgFoo | TypedMsgBar; 

interface EventHandler<T extends TypedMsg<{}, {}>> { 
    on: (messageType: T['messageType'], handler: (m: T['message']) => void) => void; 
} 

class FooBarHandler implements EventHandler<EitherFooOrBar> { 
    on(
     messageType: EitherFooOrBar['messageType'], 
     handler: (m: EitherFooOrBar['message']) => void 
    ) { 

    } 
} 

然而,它將很快變得非常單調,所有這些類型明確拼寫的聲明 - 你會想要設計的東西,將允許typescript推斷你的類型,例如類似這樣的問題:TypeScript type inference/narrowing challenge