Finns det ett sätt under kompileringstiden i TypeScript att deklarera en keyof-typ, av endast de nycklar som motsvarar en specifik typ?
Föreställ dig att vi har följande typer:
interface User {
name: string
}
interface Session {
id: string
startTime: number
moderator?: User
student: User
instructor: User
observer: User
}
Finns det ett sätt att få en keyof från Session, som endast gäller för nycklar som är av typen User? I det här fallet skulle det vara "moderator" | "student" | "instructor" | "observer", men inte "id" | "startTime". Låt oss säga i vilken version av TypeScript som helst (om detta har ändrats eller det finns en språkkategori på gång), men jag använder 4.1.2 som referens.
Redigera för associerad fråga
Den länkade frågan besvarar denna fråga helt även om jag känner att denna mer generiska formulering är användbar. Jag gjorde också ett av User-fälten valfritt eftersom min verkliga kod har valfria och det förvirrade mig. En enradare för mitt specifika problem (baserat på den länkade frågan) är:
type UserKeys = {[K in keyof Session]-?: Session[K] extends User|undefined ? K : never}[keyof Session];*Observera -? och User|undefined om du har valfria.
Svar #1
Ja, det finns med hjälp av mappade typer
type UserKeys = {
[Key in keyof Session]: Session[Key] extends User ? Key : never
}[keyof Session]
