Tapuscrit de Type 'string' est pas assignable à type de
Voici ce que j'ai dans les fruits.ts
export type Fruit = "Orange" | "Apple" | "Banana"
Maintenant, je suis de l'importation de fruits.ts dans un autre fichier d'enregistrement de fichier. Voici ce que j'ai
myString:string = "Banana";
myFruit:Fruit = myString;
Quand je fais
myFruit = myString;
J'obtiens une erreur:
De Type 'string' n'est pas cessible de type '"Orange" | "Apple" |
"La banane"'
Comment puis-je attribuer une chaîne de caractères à une variable de type personnalisé de Fruits?
- Êtes-vous sûr de l'utilisation de guillemets simples et doubles dans
export type Fruit
? - Viens de vérifier mes Fruits.ts. J'ai des guillemets simples là-bas pour le type d'exportation de Fruits = "Orange" | | "Pomme" | | "Banane". Merci
- Ressemble encore à certains des guillemets pour moi...
Vous devez vous connecter pour publier un commentaire.
Vous aurez besoin de la lancer:
Notez également que lors de l'utilisation de les littéraux de chaîne vous avez besoin d'utiliser un seul
|
const myFruit: Fruit = "Banana"
ferait.let myFruit:Fruit = "Apple" let something:string = myFruit as string
Il me donne l'erreur: Conversion de type "Fruits" de type "chaîne" est peut-être une erreur.as string
partie. J'ai essayé votre code dans la cour et il n'y a pas d'erreurs.Quand vous faites cela:
...vous êtes la création d'un type appelé
Fruit
qui ne peut contenir que les littéraux"Orange"
,"Apple"
et"Banana"
. Ce type s'étendString
, par conséquent, il peut être attribué àString
. Cependant,String
ne s'étend PAS"Orange" | "Apple" | "Banana"
, de sorte qu'il ne peut pas lui être attribué.String
est moins spécifiques. Il peut être n'importe quelle chaîne.Quand vous faites cela:
...il fonctionne. Pourquoi? Parce que le réel type de
myString
dans cet exemple est"Banana"
. Oui,"Banana"
est le type. Il s'étendString
de sorte qu'il est assignable àString
. En outre, un type s'étend un Type d'Union quand il s'étend tout de ses composants. Dans ce cas,"Banana"
, le type, s'étend"Orange" | "Apple" | "Banana"
car il s'étend de l'un de ses composants. Par conséquent,"Banana"
est assignable à"Orange" | "Apple" | "Banana"
ouFruit
.<'Banana'> 'Banana'
et qui permettra de "cast" un"Banana"
chaîne de"Banana"
le type !!!Je vois c'est un peu vieux, mais il pourrait y avoir une meilleure solution ici.
Quand vous voulez une chaîne de caractères, mais vous souhaitez que la chaîne de seulement certaines valeurs, vous pouvez utiliser les enums.
Par exemple:
Maintenant, vous savez que peu importe ce que, myFruit sera toujours la chaîne "Banane" (Ou tout autre énumérable valeur que vous choisissez). Ceci est utile pour beaucoup de choses, que ce soit le regroupement des valeurs similaires comme cela, ou la cartographie convivial valeurs de machine-amicale des valeurs, tout en appliquant et en limitant les valeurs le compilateur va permettre.
Tapuscrit
3.4
présente le nouveau 'const' affirmationVous pouvez maintenant empêcher littérale types (par exemple.
'orange'
ou'red'
) être "élargi" pour le type destring
avec un soi-disantconst
affirmation.Vous serez en mesure de le faire:
Et puis ne pas se transformer en une
string
plus - qui est la racine de l'erreur dans la question.let fruit = 'orange' as const;
lorsque, à la suite de non-angle-support-type d'affirmation de la règleIl existe plusieurs situations qui vous donne cette erreur. Dans le cas de l'OP, il y avait une valeur défini explicitement comme une chaîne. Donc, je suppose que peut-être ce qui est venu à partir d'une liste déroulante ou un service web ou un raw chaîne JSON.
Dans ce cas, un simple cast
<Fruit> fruitString
oufruitString as Fruit
est la seule solution (voir les autres réponses). Vous n'auriez jamais être en mesure d'améliorer cette situation au moment de la compilation.Cependant, il est très facile à exécuter dans ce même message d'erreur lors de l'utilisation de constantes dans votre code que ne sont pas destinés à être de type string. Ma réponse se concentre sur ce deuxième scénario:
Tout d'abord: Pourquoi la "magie" des constantes de chaîne souvent mieux qu'un enum?
Heureusement lorsque vous définir:
export type FieldErrorType = 'none' | 'missing' | 'invalid'
...vous êtes réellement définir un union de types où
'missing'
est en fait un type de!J'ai souvent courir dans le groupe "non cessible d'erreur" si j'ai une chaîne comme
'banana'
dans mon tapuscrit et le compilateur pense je voulais dire comme une chaîne de caractères, alors que je voulais vraiment pour être de typebanana
. La façon intelligente le compilateur est capable d'être dépendra de la structure de votre code.Voici un exemple de quand j'ai eu cette erreur aujourd'hui:
Dès que j'ai su que
'invalid'
ou'banana'
peut être soit un type ou d'une chaîne, j'ai réalisé que je pouvais juste affirmer une chaîne dans ce type de. Essentiellement jeté à elle-même, et de dire au compilateur non, je ne veux pas que ce soit une chaîne de caractères!Quel est donc le problème avec juste "casting" pour
FieldErrorType
(ouFruit
)Ce n'est pas le temps de compilation sûre:
Pourquoi? C'est la machine de sorte
<FieldErrorType>
est une affirmation et vous dire au compilateur un chien est un FieldErrorType! Et le compilateur va permettre!MAIS si vous ne le suivant, puis le compilateur convertit la chaîne de caractères à un type
Il suffit de regarder dehors pour des imbéciles fautes de frappe comme ceci:
Une autre façon de résoudre le problème par la coulée de l'objet parent:
Mon définitions ont été comme suit:
type d'exportation FieldName = 'nombre' | 'expirationDate' | 'cvc';
type d'exportation FieldError = 'none' | 'manquant' | 'invalide';
type d'exportation FieldErrorType = { field: FieldName, erreur: FieldError };
Disons que nous obtenons une erreur avec ce (la chaîne non cessible d'erreur):
Nous pouvons "faire valoir" l'ensemble de l'objet en tant que
FieldErrorType
comme ceci:Puis nous éviter d'avoir à faire
<'invalid'> 'invalid'
.Mais ce que sur les fautes de frappe? Ne pas
<FieldErrorType>
juste affirmer tout ce qui est sur le droit d'être de ce type. Pas dans ce cas - heureusement, le compilateur SERA plaindre si vous faites cela, parce qu'il est assez intelligent pour savoir que c'est impossible: