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
