Hello!
I have the following code:
type GenCtxResultId = GenCtxResult & { 'data-id': string }
type GenCtxResult = {
'data-user-id': string
'data-at': string
'data-party': string
}
type GenCtxResultUnion = { 'nl-insert': GenCtxResult } | { 'nl-delete': GenCtxResult } | { insert: GenCtxResultId } | { delete: GenCtxResultId }
export const generateTcCtx: {
(userData: { id: number; party: string }, line: true, insert: true, time?: number, changeId?: string): { 'nl-insert': GenCtxResult }
(userData: { id: number; party: string }, line: true, insert: false, time?: number, changeId?: string): { 'nl-delete': GenCtxResult }
(userData: { id: number; party: string }, line: false, insert: true, time?: number, changeId?: string): { insert: GenCtxResultId }
(userData: { id: number; party: string }, line: false, insert: false, time?: number, changeId?: string): { delete: GenCtxResultId }
} = (userData: { id: number; party: string }, line: boolean, insert: boolean, time = Date.now(), changeId = TextTools.randomText(6)): GenCtxResultUnion => {
return {
[(line ? 'nl-' : '') + (insert ? 'insert' : 'delete')]: {
'data-id': line ? undefined : changeId,
'data-user-id': String(userData.id),
'data-at': String(time),
'data-party': userData.party
}
} as GenCtxResultUnion
}
It works perfectly, however the TS complains about the return type:
TS2322: Type '(userData: { id: number; party: string; }, line: boolean, insert: boolean, time?: number | undefined, changeId?: string | undefined) => GenCtxResultUnion' is not assignable to type '{ (userData: { id: number; party: string; }, line: true, insert: true, time?: number | undefined, changeId?: string | undefined): { 'nl-insert': GenCtxResult; }; (userData: { id: number; party: string; }, line: true, insert: false, time?: number | undefined, changeId?: string | undefined): { ...; }; (userData: { ......'. Type 'GenCtxResultUnion' is not assignable to type '{ 'nl-insert': GenCtxResult; }'. Property ''nl-insert'' is missing in type '{ 'nl-delete': GenCtxResult; }' but required in type '{ 'nl-insert': GenCtxResult; }'.
IDE is showing all navigations correctly.
i.e.:
generateTcCtx({ id: 1, party: 'a' }, true, true)['nl-insert'] // works
generateTcCtx({ id: 1, party: 'a' }, true, true)['nl-delete'] // error
I'm unsure why it complains about the return type when I cast it to GenCtxResultUnion.
Can you give me some tips/ideas?
Thank you very much.