reactjs - Tipul string nu poate fi atribuit tipului


Încerc să creez o constantă care poate avea doar două valori, așa cum se arată în cod. Și state.lang este deja sigură din punct de vedere al tipului ca en | ar.

const keyname: 'owner_name_en' | 'owner_name_ar' = 'owner_name_' + state.lang;

Primeasc eroarea: Type 'string' is not assignable to type '"owner_name_en" | "owner_name_ar"'

Cum pot să repar această eroare?

Răspuns #1

Motivul este că declari un nou tip inline (ca un enum de șiruri) ale cărui singure valori posibile sunt 'owner_name_en' | 'owner_name_ar' (și null).

Este echivalent cu

type OwnerNameLang = 'owner_name_en' | 'owner_name_ar';
const keyname: OwnerNameLang  = 'owner_name_' + state.lang;

Acum, nu poți concatena diferite tipuri în acest fel mai mult decât ai putea face asta

const str: "hello" = "hel" + "lo"

sperând să obțină tipul inline nenumit ale cărui singure valori posibile sunt null și "hello" (deoarece partea dreaptă a atribuției este, de asemenea, două <string> în cazul tău).

Trebuie să folosești aserțiunea de tip, cum ar fi

type OwnerNameLang = 'owner_name_en' | 'owner_name_ar';
const keyname: OwnerNameLang  = ('owner_name_' + state.lang) as OwnerNameLang ;

În acest moment, poate fi de preferat să folosești un obiect cu mai multe proprietăți decompozabile (astfel încât să poți păstra doar en/ar ca un enum de tip string și să generezi acel string într-un alt mod). Dar fără a ști mai multe despre scopul acestui string, este greu să sugerez o alternativă mai bună.

Voi adăuga că sunt un susținător foarte puternic al siguranței tipurilor, în mare parte pentru că ajută dezvoltatorul să observe când, într-o zi, descoperă un nou state.lang și uită să-l gestioneze peste tot. Uneori, totuși, un șir de caractere este suficient. Decizia vă aparține.