Typescript Verifică Dacă Un Șir Există Ca O Cheie De Interfață
Pot verifica dacă un șir există ca o cheie a unei interfețe
interface list {
one: string
two: string
}
const myNumber = "one"
Cum verific dacă valoarea myNumber este o cheie de interfață
Răspuns #1
Tipul din Typescript nu este o valoare.
Prin urmare, funcționarea Javascript este imposibilă.
Totuși, în exemplu, tipul poate fi setat astfel încât myNumber să fie tipul corespunzător cheii.
interface list {
one: string
two: string
}
const myNumber: keyof list = "one"; // myNumber allow only "one" or "two";
Răspunsul #2
Pentru a face acest lucru, vei avea nevoie de ceva care să-ți permită să obții cheia interfeței în timpul rulării. O interfață nu există la rulare - este doar o construcție a TypeScript, așa că nu există în codul emis.
Creează un array care conține cheile, declară-l as const ca să nu fie extins automat tipul, și apoi vei putea să-l convertești în tipul List. Astfel vei avea atât un tip, cât și un array la rulare pe care poți folosi o verificare .includes:
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)
)
);
Link către terenul de joacă
