0
votes

Comment gérer à la fois un élément unique et un tableau de type chaîne en javascript / typescript

J'obtiens une réponse d'une API concernant les rôles d'utilisateur, si l'utilisateur a un rôle, j'obtiens un espace réservé à valeur unique, c'est-à-dire

var status = userRoles.find(x => x == role);

Si l'utilisateur a plus d'un rôle, les rôles sont considérés comme un tableau ie .

const userRoles = this.decodedToken.role as Array<string>;

Comment puis-je gérer à la fois une valeur unique et une collection dans le même espace réservé?

Ce travail de script me convient

XXX

Je dois utiliser des méthodes de collecte comme find etc

    {
  "nameid": "2",
  "unique_name": "Naveed",
  "role": [
    "SuperAdmin",
    "Admin",
    "Teacher",
    "Clerk",
    "Student"
  ],
  "nbf": 1587712850,
  "exp": 1587799250,
  "iat": 1587712850
}

cela donne une erreur en cas de valeur unique.

Toute solution, s'il vous plaît.


2 commentaires

Honnêtement, je demanderais au propriétaire de l'API s'il pouvait toujours renvoyer un tableau, mais vous pouvez utiliser Array.isArray pour le vérifier.


travail, merci et le propriétaire de l'API sera informé de votre suggestion.


3 Réponses :


3
votes

Vous pouvez convertir l'élément unique en un tableau contenant un élément unique. Vérifiez si l'élément est un tableau en utilisant Fonction Array.isArray () . Essayez ce qui suit

const userRoles = Array.isArray(this.decodedToken.role) ? this.decodedToken.role : [this.decodedToken.role];

let status = userRoles.find(x => x == role);

En guise de remarque, utiliser let au lieu de var permet de garder les choses dans l'ordre du type.


2 commentaires

Il est en fait préférable de déclarer généralement les variables comme const , à moins que votre code ne nécessite une affectation à cette variable plus tard. (De quel Typescript se plaindra)


Oui, j'ai supposé qu'OP avait l'intention de réattribuer la variable en bas de la ligne étant donné qu'il / elle a utilisé const pour userRoles , mais var pour < code> état .



0
votes

vous pouvez utiliser quelque chose comme ça. Array.isArray () peut facilement vérifier ce

//declares a variable for object

let newobject = {
 "nameid": "2",
 "unique_name": "Naveed",
 "role": [
 "SuperAdmin",
 "Admin",
 "Teacher",
 "Clerk",
 "Student"
 ],
"nbf": 1587712850,
"exp": 1587799250,
"iat": 1587712850
}
function t(arr){
 let status;
 if(Array.isArray(arr)){
  status = arr.find(x => x == "Admin");
 } else {
  status = newobject.role;
 }
console.log('status ',status);
}
t(newobject.role); //call this for activating the check


0 commentaires

2
votes

La diffusion réussira toujours, vous devez donc vérifier le type lors de l'exécution.

Vous pouvez vérifier si la valeur est un tableau en utilisant isArray

const userRoles = this.decodedToken.role as Array<string> | string;

let status

if (typeof userRoles === "string") {
 status = userRoles === role
} else {
 status = userRoles.find(x => x == role);
}

Ou vous pouvez effectuer un cast au bon type de texte en utilisant types d'union et effectuez une vérification en gardes de type . Vous pouvez donc faire quelque chose comme ça

const isRolesArray = Array.isArray(userRoles)

var status = isRolesArray ? userRoles.find(x => x == role) : userRoles === role;

De cette façon, vous obtenez tous les avantages de la vérification de type de Typescript.


0 commentaires