Powiedz, że mam:
type User = {
...
}
Chcę utworzyć nowy, user
ale ustawiłem go jako pusty obiekt:
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
Jak mam to zrobic? Nie chcę, aby zmienna była null
.
javascript
typescript
Kousha
źródło
źródło
user
być typuUser | {}
lubPartial<User>
czy trzeba przedefiniowaćUser
typ celu umożliwienia pusty obiekt. W tej chwili kompilator poprawnie mówi ci, żeuser
nie jest to plikUser
.Odpowiedzi:
Ostrzeżenia
Oto dwa godne zastrzeżenia z komentarzy.
Odpowiedź
Jednym z celów projektowych TypeScript jest „osiągnięcie równowagi między poprawnością a produktywnością”. Jeśli będzie to dla Ciebie produktywne, użyj Asercji typu, aby utworzyć puste obiekty dla zmiennych wpisanych.
type User = { Username: string; Email: string; } const user01 = {} as User; const user02 = <User>{}; user01.Email = "[email protected]";
Oto przykład pracy dla Ciebie .
źródło
Username
pozostaje niezdefiniowana, podczas gdy adnotacja typu mówi, że nie może być niezdefiniowana.Naprawdę zależy od tego, co próbujesz zrobić. Typy są dokumentacją w maszynopisie, więc chcesz pokazać zamiar użycia tego elementu podczas tworzenia typu.
Opcja 1: jeśli użytkownicy mogą mieć niektóre, ale nie wszystkie atrybuty w ciągu swojego życia
Ustaw wszystkie atrybuty jako opcjonalne
Opcja 2: Jeśli zmienne zawierające Użytkownicy mogą zaczynać się od null
type User = { ... } let u1: User = null;
Chociaż, tak naprawdę, jeśli chodzi o zadeklarowanie obiektu User, zanim będzie można wiedzieć, co zostanie do niego przypisane, prawdopodobnie chcesz to zrobić
let u1:User
bez żadnego przypisania.Opcja 3: Czego prawdopodobnie chcesz
Naprawdę, założeniem maszynopisu jest upewnienie się, że stosujesz się do modelu mentalnego, który zarysowujesz w typach, aby uniknąć popełnienia błędów. Jeśli chcesz dodawać rzeczy do obiektu jeden po drugim, jest to nawyk, który TypeScript stara się powstrzymać.
Bardziej prawdopodobne jest, że chcesz utworzyć jakieś zmienne lokalne, a następnie przypisać je do zmiennej zawierającej użytkownika, gdy będzie gotowa, aby być pełnym użytkownikiem. W ten sposób nigdy nie zostaniesz z częściowo utworzonym użytkownikiem. Te rzeczy są obrzydliwe.
let attr1: number = ... let attr2: string = ... let user1: User = { attr1: attr1, attr2: attr2 }
źródło
możesz to zrobić jak poniżej w maszynopisie
const _params = {} as any; _params.name ='nazeh abel'
ponieważ maszynopis nie zachowuje się jak javascript, więc musimy uczynić typ jak każdy, w przeciwnym razie nie pozwoli on na dynamiczne przypisanie właściwości do obiektu
źródło
Jeśli zadeklarujesz pusty literał obiektu, a następnie przypiszesz wartości później, możesz uznać te wartości za opcjonalne (mogą tam być lub nie), więc po prostu wpisz je jako opcjonalne ze znakiem zapytania:
źródło
Zauważ, że używanie
const user = {} as UserType
tylko zapewnia inteligencję, ale w czasie wykonywaniauser
jest pustym obiektem{}
i nie ma wewnątrz żadnej właściwości. to znaczyuser.Email
daundefined
zamiast""
type UserType = { Username: string; Email: string; }
Dlatego używaj
class
zconstructor
do faktycznego tworzenia obiektów z domyślnymi właściwościami.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: ""
Możesz także użyć
interface
zamiasttype
interface UserType { Username: string; Email: string; };
... a reszta kodu pozostaje taka sama.
Właściwie możesz nawet pominąć tę
constructor
część i użyć jej w ten sposób: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: ""}
źródło