Är det möjligt med TypeScript att få en lista över nycklar från ett objekt, som också är typat?


Jag har följande funktion:

function getFeature(key: string) { ... }

I min kod vill jag deklarera alla möjliga funktioner med en reservlösning som:

const FEATURES = {
  'my-feature': {
    fallback: true
  },
  'another-feature': {
    fallback: false
  }
}

Jag vill använda en typ för detta objekt, så fallback-egenskapen måste vara en boolean. Så jag skapade:

type FeatureMap = Record<string, { fallback: boolean}>

const FEATURES: FeatureMap = {
  'my-feature': {
    fallback: true
  },
  'another-feature': {
    fallback: false
  }
}

Nu vill jag ha listan över funktionstangenter, så jag måste tolka rätt funktionstangent i funktionen getFeature.

type FeatureMap = Record<string, { fallback: boolean}>

const FEATURES: FeatureMap = {
  'my-feature': {
    fallback: true
  },
  'another-feature': {
    fallback: false
  }
}

type FeatureKey = keyof typeof FEATURES;

function getFeature(key: FeatureKey) { ... }

Men nu förstår jag att key-argumentet i getFeature-funktionen bör vara en string och inte en av nycklarna i FEATURES. När jag tar bort FeatureMap-typen från const Features får jag alla namn, men då är inte fallback typad.

Finns det ett sätt att få det att fungera samtidigt?