Say I have:
type User = {
...
}
I want to create a new user
but set it to be an empty object:
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
How do I do this? I don't want the variable to be null
.
This question is related to
javascript
typescript
Note that using const user = {} as UserType
just provides intellisense but at runtime user
is empty object {}
and has no property inside. that means user.Email
will give undefined
instead of ""
type UserType = {
Username: string;
Email: string;
}
So, use class
with constructor
for actually creating objects with default properties.
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: ""
You can also use interface
instead of type
interface UserType {
Username: string;
Email: string;
};
...and rest of code remains same.
Actually, you can even skip the constructor
part and use it like this:
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: ""}
user: USER
this.user = ({} as USER)
you can do this as below in typescript
const _params = {} as any;
_params.name ='nazeh abel'
since typescript does not behave like javascript so we have to make the type as any otherwise it won't allow you to assign property dynamically to an object
Really depends on what you're trying to do. Types are documentation in typescript, so you want to show intention about how this thing is supposed to be used when you're creating the type.
Make all attributes optional
type User = {
attr0?: number
attr1?: string
}
type User = {
...
}
let u1: User = null;
Though, really, here if the point is to declare the User object before it can be known what will be assigned to it, you probably want to do let u1:User
without any assignment.
Really, the premise of typescript is to make sure that you are conforming to the mental model you outline in types in order to avoid making mistakes. If you want to add things to an object one-by-one, this is a habit that TypeScript is trying to get you not to do.
More likely, you want to make some local variables, then assign to the User-containing variable when it's ready to be a full-on User. That way you'll never be left with a partially-formed User. Those things are gross.
let attr1: number = ...
let attr2: string = ...
let user1: User = {
attr1: attr1,
attr2: attr2
}
If you declare an empty object literal and then assign values later on, then you can consider those values optional (may or may not be there), so just type them as optional with a question mark:
type User = {
Username?: string;
Email?: string;
}
Source: Stackoverflow.com