In TypeScript ist „keyof Record“ nicht „string“
Ich stoße seit Tagen gegen diese Wand und ich bin mir nicht mehr sicher, ob ich das Problem bin oder ob TypeScript kaputt ist...
Ich habe eine generische Klasse definiert, bei der das Generische Record<string, string> erweitert:
class DbTable<ColumnDefinitions extends Record<string, string>> { /* ... */ }
Zu einem späteren Zeitpunkt möchte ich die genauen Schlüssel verwenden (z. B. 'id' | 'name' anstatt nur string), also verwende ich den keyof-Operator auf dem Generikum, so:
function selectFields(fields: (keyof ColumnDefinitions)[]) { /* ... * / }
Aber keyof ColumnDefinitions löst sich in string | number | symbol auf, anstatt nur vom Typ string zu sein.
Was habe ich verpasst?!
Hier ist ein TS-Playground-Link mit einem Beispiel.
Antwort #1
Sie können nur Zeichenfolgen aus string | number | symbol in der Methodensignatur extrahieren.
Statt
fields: (keyof T)[]
du kannst schreiben
fields: (Extract<keyof T, string>)[]
und der Fehler verschwindet.
TypeScript-Spielplatz
