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ă