typescript - Givet en diskriminant, hämta typ av en egenskap för motsvarande medlem av diskriminerad union


Jag har följande diskriminerade union, där egenskapen id får en annan typ baserat på värdet av diskriminanten:

type TableKind = 'administration' | 'data'

type AdministrationTableId = 'Modules' | 'Users' | 'Roles'
type DataTableId = number

type GenericIdentifier<K extends TableKind, ID> = { kind: K, id: ID }

type AdministrationTableIdentifier = GenericIdentifier<'administration', AdministrationTableId>
type DataTableIdentifier = GenericIdentifier<'data', DataTableId>

type TableIdentifier = AdministrationTableIdentifier | DataTableIdentifier

Jag skulle vilja skapa en generisk typ som tar diskriminanten och returnerar typen av id-egenskapen hos motsvarande unionmedlem:

type GetTableIdType<K extends TableKind> = ???

type AdminId = GetTableIdType<'administration'> // returns AdministrationTableID
type DataId = GetTableIdType<'data'> // returns DataTableId

Är detta möjligt? Hur skulle detta kunna uppnås?

Svar #1

Använd bara Extract

type TableKind = 'administration' | 'data'

type AdministrationTableId = 'Modules' | 'Users' | 'Roles'
type DataTableId = number

type GenericIdentifier<K extends TableKind, ID> = { kind: K, id: ID }

type AdministrationTableIdentifier = GenericIdentifier<'administration', AdministrationTableId>

type DataTableIdentifier = GenericIdentifier<'data', DataTableId>

type TableIdentifier = AdministrationTableIdentifier | DataTableIdentifier


type GetTableIdType<K extends TableKind> = Extract<TableIdentifier, { kind: K }>['id']

type AdminId = GetTableIdType<'administration'> // returns AdministrationTableID
type DataId = GetTableIdType<'data'> // returns DataTableId

Lekplats