Cum să declari o interfață TypeScript cu un număr variabil de proprietăți?
Aceasta este o întrebare simplă și sunt surprins că nu pot găsi un răspuns clar nicăieri. Creez un API și trebuie să definesc o interfață care poate avea mai multe proprietăți (string), dar nu există un număr stabilit de proprietăți și nici nume prestabilite pentru ele (dar toate trebuie să aibă valori de tip string). Așadar, toate următoarele obiecte s-ar potrivi cu acest tip:
{ slot: "ten" }
{ class: "Luxury", base: "never", city: "Timbuktu" }
{ slot: "ten", class: "Luxury" }
M-am gândit la următoarele.
interface MyInterface {
[key: string]: string;
}
Dar pentru mine, asta spune că obiectele pot avea doar o singură proprietate (cu nume variabil), mai degrabă decât că pot avea mai multe proprietăți (cu nume variabile).
Care este cea mai bună metodă de a face acest lucru? Rețineți că nu pot controla ce nume de proprietăți va folosi codul care apelează API-ul meu. Cei care apelează pot folosi orice nume de proprietăți doresc.
Răspuns #1
Interfața ta interface ar putea părea că acceptă doar o singură proprietate care trebuie să fie de tip string, dar de fapt aceasta este sintaxa folosită pentru a defini o interfață cu orice număr de proprietăți care împărtășesc toate aceleași caracteristici (chei ca stringuri și valori ca stringuri). Acesta este numit un tip indexabil (mulțumiri lui @axiac, nu știam că are un nume).
Deci nu este nimic în neregulă să păstrezi interfața așa cum este:
interface MyInterface {
[key: string]: string;
}
Typescript vine cu un tip de utilitate nativ numit Record care se reduce la același lucru, dar este mai concis:
type MyInterface = Record<string, string>;
Funcțional, nu există nicio diferență între cele două, pe care o alegi depinde de preferința ta personală.
