En las clases de TypeScript es posible declarar tipos para propiedades, por ejemplo:
class className {
property: string;
};
¿Cómo declarar el tipo de una propiedad en un objeto literal?
He intentado el siguiente código pero no se compila:
var obj = {
property: string;
};
Recibo el siguiente error:
El nombre 'cadena' no existe en el ámbito actual
¿Estoy haciendo algo mal o es un error?
typescript
Dace Zarina
fuente
fuente
Actualización 2019-05-15 (Patrón de código mejorado como alternativa)
Después de muchos años de usar
const
y beneficiarse de un código más funcional, recomendaría no usar el siguiente en la mayoría de los casos. (Al construir objetos, forzar el sistema de tipos a un tipo específico en lugar de permitir que infiera tipos a menudo es una indicación de que algo está mal).En cambio, recomendaría usar
const
variables tanto como sea posible y luego componer el objeto como el paso final:Suma 2020-02-26
Si realmente necesita un tipo que se pueda inicializar perezosamente: márquelo como un tipo de unión anulable (nulo o tipo). El sistema de tipos evitará que lo use sin asegurarse primero de que tenga un valor.
En
tsconfig.json
, asegúrese de habilitar comprobaciones nulas estrictas:"strictNullChecks": true
Luego use este patrón y permita que el sistema de tipos lo proteja del acceso nulo / indefinido accidental:
No haga lo siguiente en el 99% de los casos:
Actualización 2016-02-10 - Para manejar TSX (Gracias @ Josh)
Use el
as
operador para TSX.Un ejemplo más largo:
Respuesta original
Use el operador de conversión para hacer esto conciso (convirtiendo nulo al tipo deseado).
Un ejemplo más largo:
Esto es mucho mejor que tener dos partes (una para declarar tipos, la segunda para declarar valores predeterminados):
fuente
property: null as string
donde la diferencia importante es elas
operador.call
en su segundo ejemplo, ¿puede asignarle un tipo completamente diferente?Error:(33, 15) TS2352:Type 'null' cannot be converted to type 'string'.
Me sorprende que nadie haya mencionado esto, pero podría crear una interfaz llamada
ObjectLiteral
que aceptekey: value
pares de tiposstring: any
:Entonces lo usarías, así:
Una ventaja adicional es que puede reutilizar esta interfaz tantas veces como lo necesite, en tantos objetos como desee.
Buena suerte.
fuente
[key: string]
parte, no de ninguna parte como la definición de tipo del valor ... Eso realmente eliminaría la utilidad de los tipos.Si está intentando escribir una anotación de tipo, la sintaxis es:
Si está intentando escribir un objeto literal, la sintaxis es:
Su código está intentando usar un nombre de tipo en una posición de valor.
fuente
var x: { property: string; } = ...;
es una tomadura de pelo! Esperaba que la elipsis fuera una sintaxis válida para ser abreviadavar x: { property: string; } = { property: 'hello' };
.En TypeScript, si estamos declarando un objeto, usaríamos la siguiente sintaxis:
Por ejemplo:
fuente
Si está intentando agregar tipings a un objeto literal desestructurado , por ejemplo en argumentos de una función, la sintaxis es:
fuente
Si sus propiedades tienen el mismo tipo, puede usar un tipo de utilidad predefinido
Record
:Por supuesto, puede ir más allá y definir un tipo personalizado para los valores de su propiedad:
fuente
let
lugar devar
aquí.fuente
En su código:
En realidad, está creando un objeto literal y asignando la cadena variable a la propiedad myProp. Aunque es una práctica muy mala, este sería un código TS válido (¡no lo uses!):
Sin embargo, lo que quiere es que se escriba el objeto literal. Esto se puede lograr de varias maneras:
Interfaz:
Tipo personalizado:
Operador de reparto:
Tipo de objeto literal:
fuente