Di que tengo:
type User = {
...
}
Quiero crear uno nuevo user
pero configurarlo para que sea un objeto vacío:
const user: User = {}; // This fails saying property XX is missing
const user: User = {} as any; // This works but I don't want to use any
¿Cómo hago esto? No quiero que la variable lo sea null
.
javascript
typescript
Kousha
fuente
fuente
user
ser de tipoUser | {}
oPartial<User>
necesita redefinir elUser
tipo para permitir un objeto vacío. En este momento, el compilador le está diciendo correctamente queuser
no es unUser
.Respuestas:
Advertencias
Aquí hay dos salvedades dignas de los comentarios.
Responder
Uno de los objetivos de diseño de TypeScript es "lograr un equilibrio entre la corrección y la productividad". Si le resulta productivo hacer esto, use Aserciones de tipo para crear objetos vacíos para las variables escritas.
type User = { Username: string; Email: string; } const user01 = {} as User; const user02 = <User>{}; user01.Email = "[email protected]";
Aquí hay un ejemplo práctico para ti .
fuente
Username
se deja sin definir, mientras que la anotación de tipo dice que no puede estar sin definir.Realmente depende de lo que intentes hacer. Los tipos son documentación en mecanografiado, por lo que desea mostrar la intención sobre cómo se supone que se debe usar esto cuando está creando el tipo.
Opción 1: si los usuarios pueden tener algunos de los atributos, pero no todos, durante su vida
Hacer que todos los atributos sean opcionales
Opción 2: si las variables que contienen usuarios pueden comenzar como nulo
type User = { ... } let u1: User = null;
Aunque, en realidad, aquí si el punto es declarar el objeto Usuario antes de que se sepa qué se le asignará, probablemente desee
let u1:User
prescindir de ninguna asignación.Opción 3: lo que probablemente quieras
Realmente, la premisa del mecanografiado es asegurarse de que se ajusta al modelo mental que esboza en tipos para evitar cometer errores. Si desea agregar cosas a un objeto uno por uno, este es un hábito que TypeScript está tratando de que no haga.
Lo más probable es que desee crear algunas variables locales y luego asignarlas a la variable que contiene el usuario cuando esté lista para ser un usuario completo. De esa forma, nunca te quedarás con un usuario parcialmente formado. Esas cosas son asquerosas.
let attr1: number = ... let attr2: string = ... let user1: User = { attr1: attr1, attr2: attr2 }
fuente
puede hacer esto como se muestra a continuación en mecanografiado
const _params = {} as any; _params.name ='nazeh abel'
Dado que el mecanografiado no se comporta como javascript, tenemos que hacer el tipo como cualquiera, de lo contrario no le permitirá asignar propiedades dinámicamente a un objeto
fuente
Si declara un objeto literal vacío y luego asigna valores más adelante, entonces puede considerar esos valores opcionales (pueden o no estar allí), así que simplemente escríbalos como opcionales con un signo de interrogación:
fuente
Tenga en cuenta que el uso
const user = {} as UserType
solo proporciona intellisense, pero en tiempo de ejecuciónuser
es un objeto vacío{}
y no tiene ninguna propiedad dentro. eso significauser.Email
que dará enundefined
lugar de""
type UserType = { Username: string; Email: string; }
Por lo tanto, use
class
conconstructor
para crear objetos con propiedades predeterminadas.type UserType = { Username: string; Email: string; }; class User implements UserType { constructor() { this.Username = ""; this.Email = ""; } Username: string; Email: string; } const myUser = new User(); console.log(myUser); // output: {Username: "", Email: ""} console.log("val: "+myUser.Email); // output: ""
También puede usar en
interface
lugar detype
interface UserType { Username: string; Email: string; };
... y el resto del código sigue siendo el mismo.
En realidad, incluso puede omitir la
constructor
parte y usarla así:class User implements UserType { Username = ""; // will be added to new obj Email: string; // will not be added } const myUser = new User(); console.log(myUser); // output: {Username: ""}
fuente