Mise à jour 2019-05-15 (modèle de code amélioré comme alternative)
Après de nombreuses années à utiliser constet à bénéficier d'un code plus fonctionnel, je recommanderais de ne pas utiliser ce qui suit dans la plupart des cas. (Lors de la construction d'objets, forcer le système de types dans un type spécifique au lieu de le laisser déduire des types est souvent une indication que quelque chose ne va pas).
Au lieu de cela, je recommanderais d'utiliser des constvariables autant que possible, puis de composer l'objet comme étape finale:
const id = GetId();
const hasStarted = true;
...
const hasFinished = false;
...
return {hasStarted, hasFinished, id};
- Cela tapera correctement tout sans avoir besoin de taper explicitement.
- Il n'est pas nécessaire de retaper les noms des champs.
- Cela conduit au code le plus propre de mon expérience.
- Cela permet au compilateur de fournir plus de vérification d'état (par exemple, si vous retournez à plusieurs endroits, le compilateur s'assurera que le même type d'objet est toujours retourné - ce qui vous encourage à déclarer la valeur de retour entière à chaque position - donnant un résultat parfaitement clair intention de cette valeur).
Ajout 2020-02-26
Si vous avez réellement besoin d'un type que vous pouvez initialiser paresseusement: marquez qu'il s'agit d'un type d'union annulable (null ou Type). Le système de type vous empêchera de l'utiliser sans vous assurer au préalable qu'il a une valeur.
Dans tsconfig.json, assurez-vous d'activer les vérifications nulles strictes:
"strictNullChecks": true
Ensuite, utilisez ce modèle et autorisez le système de type à vous protéger contre les accès nuls / non définis accidentels:
const state = {
instance: null as null | ApiService,
// OR
// instance: undefined as undefined | ApiService,
};
const useApi = () => {
// If I try to use it here, the type system requires a safe way to access it
// Simple lazy-initialization
const api = state?.instance ?? (state.instance = new ApiService());
api.fun();
// Also here are some ways to only access it if it has value:
// The 'right' way: Typescript 3.7 required
state.instance?.fun();
// Or the old way: If you are stuck before Typescript 3.7
state.instance && state.instance.fun();
// Or the long winded way because the above just feels weird
if (state.instance) { state.instance.fun(); }
// Or the I came from C and can't check for nulls like they are booleans way
if (state.instance != null) { state.instance.fun(); }
// Or the I came from C and can't check for nulls like they are booleans
// AND I was told to always use triple === in javascript even with null checks way
if (state.instance !== null && state.instance !== undefined) { state.instance.fun(); }
};
class ApiService {
fun() {
// Do something useful here
}
}
Ne faites pas ce qui suit dans 99% des cas:
Mise à jour 2016-02-10 - Pour gérer TSX (Merci @Josh)
Utilisez l' asopérateur pour TSX.
var obj = {
property: null as string
};
Un exemple plus long:
var call = {
hasStarted: null as boolean,
hasFinished: null as boolean,
id: null as number,
};
Réponse originale
Utilisez l'opérateur de transtypage pour rendre cette opération succincte (en transtypant null au type souhaité).
var obj = {
property: <string> null
};
Un exemple plus long:
var call = {
hasStarted: <boolean> null,
hasFinished: <boolean> null,
id: <number> null,
};
C'est bien mieux que d'avoir deux parties (une pour déclarer les types, la seconde pour déclarer les valeurs par défaut):
var callVerbose: {
hasStarted: boolean;
hasFinished: boolean;
id: number;
} = {
hasStarted: null,
hasFinished: null,
id: null,
};