Atualizar 2019-05-15 (Padrão de código aprimorado como alternativa)
Depois de muitos anos usando const
e se beneficiando de um código mais funcional, eu recomendaria não usar o abaixo na maioria dos casos. (Ao criar objetos, forçar o sistema de tipos a um tipo específico, em vez de permitir inferir tipos, geralmente indica que algo está errado).
Em vez disso, eu recomendaria usar as const
variáveis o máximo possível e, em seguida, componha o objeto como a etapa final:
const id = GetId();
const hasStarted = true;
...
const hasFinished = false;
...
return {hasStarted, hasFinished, id};
- Isso digitará tudo corretamente, sem a necessidade de digitar explicitamente.
- Não há necessidade de redigitar os nomes dos campos.
- Isso leva ao código mais limpo da minha experiência.
- Isso permite que o compilador forneça mais verificação de estado (por exemplo, se você retornar em vários locais, o compilador garantirá que o mesmo tipo de objeto seja sempre retornado - o que incentiva você a declarar todo o valor de retorno em cada posição - oferecendo uma visão perfeitamente clara intenção desse valor).
Adição 2020-02-26
Se você realmente precisa de um tipo que possa ser inicializado com preguiça: Marque como um tipo de união anulável (nulo ou Tipo). O sistema de tipos impedirá que você o use sem antes garantir que ele tenha um valor.
Em tsconfig.json
, certifique-se de habilitar verificações nulas estritas:
"strictNullChecks": true
Em seguida, use esse padrão e permita que o sistema de tipos o proteja contra acesso nulo / indefinido acidental:
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
}
}
Não faça o abaixo em 99% dos casos:
Atualização 10/02/2016 - Para lidar com o TSX (Obrigado @ Josh)
Use o as
operador para TSX.
var obj = {
property: null as string
};
Um exemplo mais longo:
var call = {
hasStarted: null as boolean,
hasFinished: null as boolean,
id: null as number,
};
Resposta original
Use o operador de conversão para tornar isso sucinto (convertendo nulo para o tipo desejado).
var obj = {
property: <string> null
};
Um exemplo mais longo:
var call = {
hasStarted: <boolean> null,
hasFinished: <boolean> null,
id: <number> null,
};
Isso é muito melhor do que ter duas partes (uma para declarar tipos e a segunda para declarar padrões):
var callVerbose: {
hasStarted: boolean;
hasFinished: boolean;
id: number;
} = {
hasStarted: null,
hasFinished: null,
id: null,
};