Comment mettre en option paramètres de classe Angulaire 2-Tapuscrit?
Je sais en caractères d'imprimerie facultatif paramètres peuvent être marquée par point d'interrogation.
Cependant, le seul moyen que j'ai trouvé en fait d'instancier la classe avec nouveau mot-clé.
Le truc, c'est que, sur la base Angulaire 2 starter "héros" tutorial classes sont pas instancié via le nouveau mot-clé et que j'ai compris c'est fait en interne par Angulaire.
Par exemple, j'ai ce code:
modèles/utilisateurs.ts
export class User {
id: number;
name: string; //I want this to be optional
}
modèles/maquette utilisateurs.ts
import {User} from './user';
export var USERS: User[] = [
{
id: 1
//no name (I wanted it to be optional for user with id 1)
},
{
id: 2,
name: "User 2"
},
]
services/utilisateur.service.ts
import {Injectable} from 'angular2/core';
import {USERS} from './../models/mock-users';
@Injectable()
export class UserService {
getUsers() {
return Promise.resolve(USERS);
}
}
vues/mon-composant.composante.ts
//imports here...
@Component({
//...
})
export class MyComponent {
constructor(private _userService: UserService) { }
getUsers() {
this._userService.getUsers().then(users => console.log(users));
}
}
Vous devez vous connecter pour publier un commentaire.
Dans votre cas, il peut être plus pratique d'utiliser une interface pour l'Utilisateur à la place.
Je utiliser les interfaces quand je veux définir la "forme" d'un objet, les classes quand j'ai besoin d'ajouter un comportement (méthodes). Si vous avez besoin de déplacer des données, j'utilise un interface.
Si vous avez besoin d'une classe, la syntaxe pour la création d'instances d'Utilisateurs dans
mock-users.ts
devraient être un peu différent. Tout d'abord, il n'y a pas de "facultatif champs de la classe" en caractères d'imprimerie. N'importe quel champ peut être pas ensemble/'undefined', de sorte qu'il n'est pas logique marquer un champ facultatif. Vous pouvez instancier une classe avec lenew
mot-clé - l'inconvénient est que vous devez écrire un constructeur pour définir des valeurs de champ ou de céder l'instance d'une variable et l'ensemble des champs. Mais il n'y a rien de mal à utiliser le mot clé new, surtout pour les objets de test.Vous pouvez aussi instancier un objet avec un objet littéral comme vous l'avez fait dans
mock-users.ts
- vous besoin d'être plus explicite par l'ajout d'un plâtre.Sans le cast, le Tapuscrit compilateur génère une erreur. C'est par la conception d'attraper un erreurs. Si vous voulez en savoir plus sur l' (intéressant) raisons, en voici une autre, liée à une discussion détaillée sur certains de la pensée derrière la vérification de type:
Pourquoi je reçois un message d'erreur "Objet littéral pouvez uniquement spécifier les propriétés connues"?
https://basarat.gitbooks.io/typescript/content/docs/types/freshness.html
class
àinterface
devrait faire l'affaire. Je vais élargir la réponse.JsFiddle
À l'aide d'un constructeur va probablement rendre votre vie beaucoup plus facile. Vous n'obtiendrez pas
undefined
lorsque vous essayez d'obtenir un nom d'Utilisateur et vous serez en mesure de définir les fonctions de la classe. La seule différence est que vous devez utilisernew User(...)
au lieu de simplement en utilisant un objet littéral comme un type.Un autre moyen est d'utiliser
Object.assign
d'étendre valide tapé objet avec la propriété, vous avez seulement besoin (en omettant biena
etc
dans cet exemple)Personnellement, je préfère cette syntaxe pour éviter multiligne l'initialisation des objets et l'ennuyeux chose pour créer une interface (donc un autre fichier tout à fait inutile si un correspondant de classe existe) pour chaque modèle de mon application.
En outre, n'hésitez pas à définir la valeur par défaut dans la définition de votre classe, même si elle n'est pas obligatoire pour ce cas.
Une dernière chose importante est que vous ne perdiez pas les méthodes de la classe dans ce cas (s'opposant à {} casting)