Esto es lo que tengo en fruit.ts
export type Fruit = "Orange" | "Apple" | "Banana"
Ahora estoy importando fruit.ts en otro archivo mecanografiado. Esto es lo que tengo
myString:string = "Banana";
myFruit:Fruit = myString;
Cuando lo hago
myFruit = myString;
Me sale un error:
El tipo 'cadena' no se puede asignar al tipo '"Naranja" | "Manzana" | "Plátano"'
¿Cómo puedo asignar una cadena a una variable de tipo personalizado Fruit?
javascript
typescript
angular
usuario6123723
fuente
fuente
export type Fruit
?Respuestas:
Tendrás que lanzarlo :
También tenga en cuenta que cuando usa literales de cadena necesita usar solo uno
|
Editar
Como se menciona en la otra respuesta de @Simon_Weaver, ahora es posible afirmarlo a
const
:fuente
const myFruit: Fruit = "Banana"
lo haría.let myFruit:Fruit = "Apple" let something:string = myFruit as string
Me está dando un error: la conversión del tipo 'Fruta' al tipo 'cadena' puede ser un error.as string
parte. He intentado su código en el patio de recreo y no hay errores.const myString: string = 'Bananaaa';
, no obtengo errores de compilación debido a la conversión ... ¿no hay forma de hacerlo mientras escribo revisando la cadena?Typecript
3.4
presenta la nueva afirmación 'const'Ahora puede evitar que los tipos literales (por ejemplo,
'orange'
o'red'
) se 'amplíen' para escribirstring
con una llamadaconst
aserción.Podrás hacer:
Y luego ya no se convertirá en uno
string
, que es la raíz del problema en la pregunta.fuente
let fruit = 'orange' as const;
cuando se sigue la regla de aserción de tipo sin ángulo de paréntesisCuando haces esto:
... está creando un tipo llamado
Fruit
que solo puede contener los literales"Orange"
,"Apple"
y"Banana"
. Este tipo se extiendeString
, por lo tanto, se puede asignar aString
. Sin embargo,String
NO se extiende"Orange" | "Apple" | "Banana"
, por lo que no se le puede asignar.String
Es menos específico . Puede ser cualquier cadena .Cuando haces esto:
...funciona. ¿Por qué? Porque el tipo real de
myString
en este ejemplo es"Banana"
. Si,"Banana"
es el tipo . Se extiendeString
por lo que es asignable aString
. Además, un tipo extiende un tipo de unión cuando extiende cualquiera de sus componentes. En este caso,"Banana"
el tipo se extiende"Orange" | "Apple" | "Banana"
porque extiende uno de sus componentes. Por lo tanto,"Banana"
es asignable a"Orange" | "Apple" | "Banana"
oFruit
.fuente
<'Banana'> 'Banana'
y eso 'arrojará' una"Banana"
cadena al"Banana"
tipo!<const> 'Banana'
cuál es mejor :-)Veo que esto es un poco viejo, pero podría haber una mejor solución aquí.
Cuando desee una cadena, pero desea que la cadena solo coincida con ciertos valores, puede usar enumeraciones .
Por ejemplo:
Ahora sabrá que pase lo que pase, myFruit siempre será la cadena "Banana" (o cualquier otro valor enumerable que elija). Esto es útil para muchas cosas, ya sea agrupando valores similares como este, o asignando valores fáciles de usar a valores amigables para la máquina, todo mientras impone y restringe los valores que el compilador permitirá.
fuente
let myFruit: Fruit = "Banana"
.Hay varias situaciones que le darán este error particular. En el caso del OP, había un valor definido explícitamente como una cadena . Entonces, debo suponer que tal vez esto vino de un menú desplegable, o servicio web o cadena JSON sin procesar.
En ese caso, un elenco simple
<Fruit> fruitString
ofruitString as Fruit
es la única solución (ver otras respuestas). Nunca podría mejorar esto en tiempo de compilación. [ Editar: ¡Mira mi otra respuesta sobre<const>
]!Sin embargo, es muy fácil encontrarse con este mismo error cuando se usan constantes en su código que nunca pretenden ser de tipo cadena . Mi respuesta se centra en ese segundo escenario:
En primer lugar: ¿por qué las constantes de cadena 'mágicas' a menudo son mejores que una enumeración?
Afortunadamente cuando define:
export type FieldErrorType = 'none' | 'missing' | 'invalid'
... en realidad estás definiendo una unión de tipos donde
'missing'
realmente es un tipo!A menudo me encuentro con el error 'no asignable' si tengo una cadena como
'banana'
en mi mecanografiado y el compilador cree que lo dije como una cadena, mientras que realmente quería que fuera de tipobanana
. Lo inteligente que pueda ser el compilador dependerá de la estructura de su código.Aquí hay un ejemplo de cuándo recibí este error hoy:
Tan pronto como descubrí eso
'invalid'
o'banana'
podría ser un tipo o una cadena, me di cuenta de que podía afirmar una cadena en ese tipo . Esencialmente, házlo en sí mismo y dile al compilador que no, ¡no quiero que sea una cadena !¿Cuál es tan malo con sólo 'fundición' a
FieldErrorType
(oFruit
)No es tiempo de compilación seguro:
¿Por qué? Esto es mecanografiado, así que
<FieldErrorType>
es una afirmación y le está diciendo al compilador que un perro es un FieldErrorType . ¡Y el compilador lo permitirá!PERO si haces lo siguiente, el compilador convertirá la cadena a un tipo
Solo ten cuidado con errores estúpidos como este:
Otra forma de resolver el problema es lanzar el objeto padre:
Mis definiciones fueron las siguientes:
tipo de exportación FieldName = 'número' | 'expirationDate' | 'cvv'; tipo de exportación FieldError = 'none' | 'desaparecido' | 'inválido'; tipo de exportación FieldErrorType = {field: FieldName, error: FieldError};
Digamos que tenemos un error con esto (el error de cadena no asignable):
Podemos 'afirmar' todo el objeto de
FieldErrorType
esta manera:Entonces evitamos tener que hacer
<'invalid'> 'invalid'
.¿Pero qué hay de los errores tipográficos? No
<FieldErrorType>
solo afirma lo que está a la derecha de ser de ese tipo. No en este caso - por suerte el compilador SE quejarse si usted hace esto, porque es lo suficientemente inteligente para saber que es imposible:fuente
Todas las respuestas anteriores son válidas, sin embargo, hay algunos casos en que el tipo literal de cadena es parte de otro tipo complejo. Considere el siguiente ejemplo:
Tienes múltiples soluciones para arreglar esto. Cada solución es válida y tiene sus propios casos de uso.
1) La primera solución es definir un tipo para el tamaño y exportarlo desde foo.ts. Esto es bueno si necesita trabajar con el parámetro de tamaño por sí solo. Por ejemplo, tiene una función que acepta o devuelve un parámetro de tamaño de letra y desea escribirlo.
2) La segunda opción es lanzarlo al tipo ToolbarTheme. En este caso, no necesita exponer el interno de ToolbarTheme si no lo necesita.
fuente
Si,
dropdownvalue[]
por ejemplo, está enviando datos a una burla, compóngala como una matriz de objetos con valor y propiedades de visualización.ejemplo :
fuente
Estaba enfrentando el mismo problema, hice los cambios a continuación y el problema se resolvió.
Abra el archivo watchQueryOptions.d.ts
Cambie el tipo de consulta any en lugar de DocumentNode , lo mismo para la mutación
Antes de:
Después:
fuente