Sagen wir, ich habe:
type User = {
...
}
Ich möchte ein neues user
Objekt erstellen, aber es als leeres Objekt festlegen:
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
Wie mache ich das? Ich möchte nicht, dass die Variable ist null
.
javascript
typescript
Kousha
quelle
quelle
user
vom TypUser | {}
oder seinPartial<User>
, oder Sie müssen denUser
Typ neu definieren , um ein leeres Objekt zuzulassen. Im Moment sagt Ihnen der Compiler korrekt, dass diesuser
kein a istUser
.Antworten:
Vorsichtsmaßnahmen
Hier sind zwei würdige Vorbehalte aus den Kommentaren.
Antworten
Eines der Entwurfsziele von TypeScript ist es, "ein Gleichgewicht zwischen Korrektheit und Produktivität herzustellen ". Wenn dies für Sie produktiv ist , erstellen Sie mit Type Assertions leere Objekte für typisierte Variablen.
type User = { Username: string; Email: string; } const user01 = {} as User; const user02 = <User>{}; user01.Email = "[email protected]";
Hier ist ein Arbeitsbeispiel für Sie .
quelle
Username
bleibt die Eigenschaft undefiniert, während die Typanmerkung besagt, dass sie nicht undefiniert sein kann.Kommt wirklich darauf an, was du versuchst zu tun. Typen sind Dokumentationen in Typoskript, daher möchten Sie die Absicht zeigen, wie dieses Ding beim Erstellen des Typs verwendet werden soll.
Option 1: Wenn Benutzer während ihres Lebens möglicherweise einige, aber nicht alle Attribute haben
Machen Sie alle Attribute optional
Option 2: Wenn Variablen, die Benutzer enthalten, mit null beginnen können
type User = { ... } let u1: User = null;
Wenn es hier darum geht, das Benutzerobjekt zu deklarieren, bevor bekannt ist, was ihm zugewiesen wird, möchten Sie wahrscheinlich auf
let u1:User
eine Zuweisung verzichten.Option 3: Was Sie wahrscheinlich wollen
Die Prämisse von Typoskript besteht darin, sicherzustellen, dass Sie dem mentalen Modell entsprechen, das Sie in Typen skizzieren, um Fehler zu vermeiden. Wenn Sie einem Objekt nacheinander Dinge hinzufügen möchten, ist dies eine Angewohnheit, die TypeScript versucht, Sie dazu zu bringen, dies nicht zu tun.
Wahrscheinlicher ist, dass Sie einige lokale Variablen erstellen und diese dann der benutzerhaltigen Variablen zuweisen möchten, wenn sie bereit ist, ein vollwertiger Benutzer zu sein. Auf diese Weise bleibt Ihnen niemals ein teilweise geformter Benutzer übrig. Diese Dinge sind eklig.
let attr1: number = ... let attr2: string = ... let user1: User = { attr1: attr1, attr2: attr2 }
quelle
Sie können dies wie unten im Typoskript tun
const _params = {} as any; _params.name ='nazeh abel'
Da sich Typenskript nicht wie Javascript verhält, müssen wir den Typ wie jeden anderen festlegen, da Sie sonst einem Objekt keine dynamische Eigenschaft zuweisen können
quelle
Wenn Sie ein leeres Objektliteral deklarieren und später Werte zuweisen, können Sie diese Werte als optional betrachten (möglicherweise vorhanden oder nicht vorhanden). Geben Sie sie daher einfach als optional mit einem Fragezeichen ein:
quelle
Beachten Sie, dass die Verwendung
const user = {} as UserType
nur Intellisense bereitstellt, zur Laufzeituser
jedoch ein leeres Objekt ist{}
und keine Eigenschaft enthält. das heißtuser.Email
gebenundefined
statt""
type UserType = { Username: string; Email: string; }
So verwenden Sie
class
mitconstructor
für tatsächlich Objekte mit Standardeigenschaften zu schaffen.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: ""
Sie können auch
interface
anstelle von verwendentype
interface UserType { Username: string; Email: string; };
... und der Rest des Codes bleibt gleich.
Sie können das
constructor
Teil sogar überspringen und wie folgt verwenden: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: ""}
quelle