Typescript Kontrollera Om En Sträng Finns Som En Nyckel I Ett Interface
Kan jag kontrollera om en sträng finns som en gränssnittsnyckel
interface list {
one: string
two: string
}
const myNumber = "one"
Hur kontrollerar jag om värdet myNumber är en interface-nyckel
Svar #1
Typen av Typescript är inte ett värde.
Därför är drift av Javascript omöjlig.
Men i exemplet kan typen anges så att myNumber är typen som motsvarar nyckeln.
interface list {
one: string
two: string
}
const myNumber: keyof list = "one"; // myNumber allow only "one" or "two";
Svar #2
För att göra detta behöver du något som låter dig få nyckeln till gränssnittet vid körning. Ett interface finns inte vid körning - det är enbart en TypeScript-konstruktion, så det finns inte i den genererade koden.
Skapa en array som innehåller nycklarna, deklarera den as const så att den inte automatiskt får en vidgad typ, och då kommer du att kunna omvandla den till List-typen. Då kommer du att ha både en typ och en runtime-array som du kan använda en .includes-kontroll på:
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)
)
);
Lekplatslänk
