Typescript überprüfen, ob ein String als Schnittstellenschlüssel existiert
Kann ich überprüfen, ob ein String als Schnittstellenschlüssel existiert
interface list {
one: string
two: string
}
const myNumber = "one"
Wie überprüfe ich, ob meinNumber-Wert ein Schnittstellenschlüssel ist
Antwort #1
Der Typ von Typescript ist kein Wert.
Daher ist der Betrieb von Javascript unmöglich.
In dem Beispiel kann jedoch der Typ so festgelegt werden, dass myNumber der dem Schlüssel entsprechende Typ ist.
interface list {
one: string
two: string
}
const myNumber: keyof list = "one"; // myNumber allow only "one" or "two";
Antwort #2
Um dies zu tun, benötigen Sie etwas, das Ihnen erlaubt, den Schlüssel des Interfaces zur Laufzeit zu erhalten. Ein interface existiert zur Laufzeit nicht - es ist eine rein TypeScript-Konstruktion, daher existiert es im ausgegebenen Code nicht.
Erstellen Sie ein Array, das die Schlüssel enthält, deklarieren Sie es as const, damit es nicht automatisch typverbreitert wird, und dann können Sie es in den List-Typ umwandeln. Dann haben Sie sowohl einen Typ als auch ein Laufzeit-Array, das Sie mit einer .includes-Prüfung verwenden können:
const listKeys = ['one', 'two'] as const;
type List = Record<typeof listKeys[number], string>;
// ...
const obj = {
one: 'one',
two: 'two',
three: 'three'
};
// Transformation to string[] needed because of an odd design decision:
// https://github.com/Microsoft/TypeScript/issues/26255
const newObj = Object.fromEntries(
Object.entries(obj).filter(
([key]) => (listKeys as unknown as string[]).includes(key)
)
);
Spielplatz-Link
