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.
3 Réponses :
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.
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 .
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
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.
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.