Actualización 2019-05-15 (Patrón de código mejorado como alternativa)
Después de muchos años de usar const
y beneficiarse de un código más funcional, recomendaría no usar el siguiente en la mayoría de los casos. (Al construir objetos, forzar el sistema de tipos a un tipo específico en lugar de permitir que infiera tipos a menudo es una indicación de que algo está mal).
En cambio, recomendaría usar const
variables tanto como sea posible y luego componer el objeto como el paso final:
const id = GetId();
const hasStarted = true;
...
const hasFinished = false;
...
return {hasStarted, hasFinished, id};
- Esto escribirá correctamente todo sin necesidad de escribir explícitamente.
- No es necesario volver a escribir los nombres de campo.
- Esto lleva al código más limpio de mi experiencia.
- Esto permite que el compilador proporcione más verificación de estado (por ejemplo, si regresa en varias ubicaciones, el compilador se asegurará de que siempre se devuelva el mismo tipo de objeto, lo que lo alienta a declarar el valor de retorno completo en cada posición), lo que le da un claro perfectamente intención de ese valor).
Suma 2020-02-26
Si realmente necesita un tipo que se pueda inicializar perezosamente: márquelo como un tipo de unión anulable (nulo o tipo). El sistema de tipos evitará que lo use sin asegurarse primero de que tenga un valor.
En tsconfig.json
, asegúrese de habilitar comprobaciones nulas estrictas:
"strictNullChecks": true
Luego use este patrón y permita que el sistema de tipos lo proteja del acceso nulo / indefinido accidental:
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
}
}
No haga lo siguiente en el 99% de los casos:
Actualización 2016-02-10 - Para manejar TSX (Gracias @ Josh)
Use el as
operador para TSX.
var obj = {
property: null as string
};
Un ejemplo más largo:
var call = {
hasStarted: null as boolean,
hasFinished: null as boolean,
id: null as number,
};
Respuesta original
Use el operador de conversión para hacer esto conciso (convirtiendo nulo al tipo deseado).
var obj = {
property: <string> null
};
Un ejemplo más largo:
var call = {
hasStarted: <boolean> null,
hasFinished: <boolean> null,
id: <number> null,
};
Esto es mucho mejor que tener dos partes (una para declarar tipos, la segunda para declarar valores predeterminados):
var callVerbose: {
hasStarted: boolean;
hasFinished: boolean;
id: number;
} = {
hasStarted: null,
hasFinished: null,
id: null,
};