I’ve added a simplified version of my problem here
type BaseAssetType = {
z?: string
}
/** Assets */
type AssetTypeAData = {
a : string
}
type AssetTypeBData = {
b : string
}
interface TEventAssetTypeA extends BaseAssetType {
assetType: 'a',
data: AssetTypeAData
}
interface TEventAssetTypeB extends BaseAssetType {
assetType: 'b',
data: AssetTypeBData
}
type TEventAssetTypes = TEventAssetTypeA | TEventAssetTypeB
interface IStreamToAssetType {
streama: TEventAssetTypeA
streamb: TEventAssetTypeB
}
/** Logs */
interface LogsEvent extends BaseAssetType {
logs: string
}
type Topics = 'streama' | 'streamb' | 'streamc'
interface IStreamToLogType {
streamc: LogsEvent
}
interface IStreamsToAlLEvents {
streama: TEventAssetTypeA
streamb: TEventAssetTypeB
streamc: LogsEvent
}
const publishAsssetMessageToStream = <T extends keyof IStreamToAssetType, MA extends IStreamToAssetType[T]>(topic: T, message: MA) => publishToStreamCore<T, MA>({topic, message})
const publishToStreamCore = <T extends keyof IStreamsToAlLEvents, M extends IStreamsToAlLEvents[T]>({topic, message}:{topic: T, message: M}) => {
console.log(topic, message)
}
publishAsssetMessageToStream('streama', {
assetType: 'a',
data: { a: '12313'}
})
I have a core function publishToStreamCore
which maps messages to specific streams.
I have a higher level function which can publish a subset of those messages to their related substreams.
However I am getting the following error:
Type 'MA' does not satisfy the constraint 'IStreamsToAlLEvents[T]'.
Type 'IStreamToAssetType[T]' is not assignable to type 'IStreamsToAlLEvents[T]'.
Property 'streamc' is missing in type 'IStreamToAssetType' but required in type 'IStreamsToAlLEvents'.
Type 'MA' is not assignable to type 'never'.
The intersection 'TEventAssetTypeA & TEventAssetTypeB' was reduced to 'never' because property 'assetType' has conflicting types in some constituents.
Type 'IStreamToAssetType[T]' is not assignable to type 'never'.
Type 'TEventAssetTypeA | TEventAssetTypeB' is not assignable to type 'never'.
Type 'TEventAssetTypeA' is not assignable to type 'never'.(2344)
Regardless, what is the best way to get around this?
I’m particularly surprised by the following line:
The intersection 'TEventAssetTypeA & TEventAssetTypeB' was reduced to 'never' because property 'assetType' has conflicting types in some constituents.
Why I am ending up with an intersection for MA at publishAsssetMessageToStream
when I was hoping to have a union of either TEventAssetTypeA | TEventAssetTypeB
?
Ideally, I would like to be specific in the core function, but only give higher level functions to other developers that would call this with a subset of the different events/topics.