Website-Suche

Überprüfen, ob ein Objekt in TypeScript einen Schlüssel hat, und diesen Schlüssel verwenden


Ich habe den folgenden Code:

let show = {
    createTag: false,
    updateFeature: false,
    createFeatureGroup: false,
    deleteFeature: false,
    deleteCycle: false,
};

Und ich bekomme einen Wert aus der Abfragezeichenfolge, den ich mit den Schlüsseln von show abgleichen möchte.

Der folgende Code funktioniert einwandfrei, aber ich möchte eine Möglichkeit, Typescript es ableiten zu lassen und das Casting zu vermeiden:

const showDialog = $page.query.get('show') || '';

if (showDialog && showDialog in show) {
    // I want to get rid of the "<keyof typeof show>" cast
    show[<keyof typeof show>showDialog] = true; 
}

Ich dachte, dass das bloße Ausführen von showDialog in show in TypeScript dazu führen würde, dass es weiß, dass innerhalb dieses if showDialog ein Schlüssel von show ist, aber es scheint nicht der Fall zu sein.

Antwort #1

Der von @paolostyle vorgestellte Typenschutz ist sehr spezifisch für das show-Objekt. Der folgende Ausschnitt ist allgemeiner und kann für jeden Schlüssel in jedem Objekt verwendet werden:

export function isKeyOfObject<T extends object>(
  key: string | number | symbol,
  obj: T,
): key is keyof T {
  return key in obj;
}

Antwort #2

Sie können eine Typwache erstellen:

function isValidParam(k: string): k is keyof typeof show {
  return k in show;
}

const showDialog = $page.query.get('show') || '';

if (isValidParam(showDialog)) {
    show[showDialog] = true; 
}

aber du entscheidest, ob es sich lohnt. Ich würde persönlich wahrscheinlich einfach den Gips behalten.

Verwandte Artikel