Aggiornamento 15/05/2019 (modello di codice migliorato come alternativa)
Dopo molti anni di utilizzo const
e di utilizzo di un codice più funzionale, nella maggior parte dei casi consiglierei di non utilizzare quanto segue. (Quando si costruiscono oggetti, forzare il sistema di tipi in un tipo specifico invece di lasciarne dedurre i tipi è spesso un'indicazione che qualcosa non va).
Invece, consiglierei di utilizzare le const
variabili il più possibile e quindi comporre l'oggetto come passaggio finale:
const id = GetId();
const hasStarted = true;
...
const hasFinished = false;
...
return {hasStarted, hasFinished, id};
- Questo scriverà correttamente tutto senza la necessità di digitare esplicitamente.
- Non è necessario digitare nuovamente i nomi dei campi.
- Questo porta al codice più pulito dalla mia esperienza.
- Ciò consente al compilatore di fornire una maggiore verifica dello stato (ad esempio, se si ritorna in più posizioni, il compilatore assicurerà che venga sempre restituito lo stesso tipo di oggetto, il che ti incoraggia a dichiarare l'intero valore di ritorno in ciascuna posizione) fornendo un risultato perfettamente chiaro intenzione di quel valore).
Aggiunta 2020-02-26
Se in realtà hai bisogno di un tipo che puoi inizializzare pigramente: Segna come un tipo di unione nullable (null o Type). Il sistema dei tipi ti impedirà di usarlo senza prima assicurarti che abbia un valore.
In tsconfig.json
, assicurati di abilitare controlli null rigorosi:
"strictNullChecks": true
Quindi utilizzare questo modello e consentire al sistema di tipi di proteggerti da accessi nulli / indefiniti accidentali:
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
}
}
Non eseguire le operazioni seguenti nel 99% dei casi:
Aggiornamento 10-02-2016 - Per gestire TSX (Grazie @Josh)
Utilizzare l' as
operatore per TSX.
var obj = {
property: null as string
};
Un esempio più lungo:
var call = {
hasStarted: null as boolean,
hasFinished: null as boolean,
id: null as number,
};
Risposta originale
Usa l'operatore cast per rendere questo succinto (lanciando null al tipo desiderato).
var obj = {
property: <string> null
};
Un esempio più lungo:
var call = {
hasStarted: <boolean> null,
hasFinished: <boolean> null,
id: <number> null,
};
È molto meglio che avere due parti (una per dichiarare i tipi, la seconda per dichiarare i valori predefiniti):
var callVerbose: {
hasStarted: boolean;
hasFinished: boolean;
id: number;
} = {
hasStarted: null,
hasFinished: null,
id: null,
};