O Typescript atualmente (ou há planos para) oferecer suporte ao operador de navegação segura de?.
ou seja:
var thing = foo?.bar
// same as:
var thing = (foo) ? foo.bar : null;
Além disso, existe um nome mais comum para esse operador (é extremamente difícil pesquisar no Google).
typescript
Marty Pitt
fonte
fonte
property ?? property2
, mas se você tentouproperty.company ?? property1.company
eproperty
foi nula, você deseja obter umNullReferenceException
Respostas:
Atualização : é suportado no TypeScript 3.7 e chamado Encadeamento opcional : https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html#optional-chaining
Não consigo encontrar nenhuma referência a ele na especificação da linguagem TypeScript .
Quanto ao que chamar esse operador no CoffeeScript, ele é chamado de operador existencial (especificamente, a "variante acessadora" do operador existencial).
Da documentação do CoffeeScript sobre operadores :
Portanto, a variante acessadora do operador existencial parece ser a maneira correta de se referir a esse operador; e o TypeScript atualmente não parece suportá-lo (embora outros tenham expressado desejo por essa funcionalidade ).
fonte
Não é tão legal quanto um single ?, mas funciona:
Você pode usar quantos && quiser:
fonte
Isso é definido na especificação de encadeamento opcional do ECMAScript, portanto, provavelmente devemos nos referir ao encadeamento opcional quando discutirmos isso. Provável implementação:
O longo e curto deste é que a equipe do TypeScript está aguardando o aperto da especificação do ECMAScript, para que sua implementação possa ser ininterrupta no futuro. Se eles implementassem algo agora, acabaria precisando de grandes mudanças se o ECMAScript redefinisse sua especificação.
Consulte Especificação de encadeamento opcional
Onde algo nunca será o JavaScript padrão, a equipe do TypeScript pode implementar como achar melhor, mas, para futuras adições ao ECMAScript, eles querem preservar a semântica, mesmo que dêem acesso antecipado, como o fazem para muitos outros recursos.
Cortes curtos
Portanto, todos os operadores funky JavaScripts estão disponíveis, incluindo as conversões de tipo, como ...
Solução Manual
Mas voltando à pergunta. Eu tenho um exemplo obtuso de como você pode fazer algo semelhante em JavaScript (e, portanto, em TypeScript), embora eu definitivamente não esteja sugerindo que seja uma graciosa como o recurso que você realmente procura.
Portanto, se
foo
is éundefined
o resultadoundefined
e sefoo
é definido e tem uma propriedade nomeadabar
que possui um valor, o resultado é esse valor.Eu coloquei um exemplo no JSFiddle .
Isso parece bastante superficial para exemplos mais longos.
Função Cadeia
Se você está desesperado por uma versão mais curta enquanto a especificação ainda está no ar, eu uso esse método em alguns casos. Ele avalia a expressão e retorna um padrão se a cadeia não puder ser satisfeita ou acabar nula / indefinida (observe que
!=
é importante aqui, não queremos usá-lo!==
, pois queremos um pouco de malabarismo positivo aqui).fonte
(this.loop || {}).nativeElement
dizendoProperty 'nativeElement' does not exist on type '{}'. any
this.loop
typeof angular.io/api/core/ElementRef{}
, ou 2) usar uma asserção de tipo para silenciar o compilador.foo
é um objeto útil real:(foo || {}).bar
geralmente não será compilado em texto datilografado, porque{}
não será do mesmo tipo quefoo
. Esse é o problema que a solução da @ VeganHunter pretende evitar.Atualização: Sim, é suportado agora!
Foi lançado com o TypeScript 3.7: https://devblogs.microsoft.com/typescript/announcing-typescript-3-7/
É chamado de encadeamento opcional : https://devblogs.microsoft.com/typescript/announcing-typescript-3-7/#optional-chaining
Com ele o seguinte:
é equivalente a:
Resposta antiga
Há uma solicitação de recurso aberto para isso no github, onde você pode expressar sua opinião / desejo: https://github.com/Microsoft/TypeScript/issues/16
fonte
Editar 13 de novembro de 2019!
Desde 5 de novembro de 2019, o TypeScript 3.7 foi lançado e agora suporta
?.
o operador de encadeamento opcional 🎉🎉🍾🍾🎉 !!!https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html#optional-chaining
Apenas para fins históricos:
Edit: Eu atualizei a resposta graças ao comentário fracz.
Lançamento do TypeScript 2.0
!.
Não é o mesmo que?.
(Navegador seguro em C #)Veja esta resposta para mais detalhes:
https://stackoverflow.com/a/38875179/1057052
Isso informará apenas o compilador que o valor não é nulo ou indefinido. Isso não verifica se o valor é nulo ou indefinido.
Operador de asserção não nula TypeScript
fonte
?
porque afirma que o valor está definido.?
espera-se que silenciosamente falhe / avalie como falso. De qualquer forma, é bom saber.O operador de encadeamento opcional do Elvis (?.) É suportado no TypeScript 3.7.
Você pode usá-lo para verificar valores nulos:
cats?.miows
retorna nulo se gatos for nulo ou indefinido.Você também pode usá-lo para chamada de método opcional:
cats.doMiow?.(5)
chamará doMiow, se existir.Acesso a propriedade também é possível:
cats?.['miows']
.Referência: https://devblogs.microsoft.com/typescript/announcing-typescript-3-7-beta/
fonte
?:
. Você tem uma referência?O operador
?.
não é suportado no TypeScript versão 2.0 .Então, eu uso a seguinte função:
o uso fica assim:
Além disso, você pode definir um valor padrão:
Funciona muito bem com o IntelliSense no Visual Studio.
fonte
elvis<T>
;-)Finalmente chegou!
Aqui estão alguns exemplos:
Mas não funciona exatamente da mesma forma que você supõe.
Em vez de avaliar
neste pequeno trecho de código, estamos todos acostumados a escrever
realmente avalia como
que funciona para todos os valores falsey como uma string vazia, 0 ou false.
Eu simplesmente não tenho uma explicação de por que eles não o compilam
foo == null
fonte
Criamos esse método utilitário enquanto trabalhamos no Phonetradr, que pode fornecer acesso seguro a propriedades profundas com o Typecript:
fonte
return this.entry.fields.featuredImage.fields.file.url;
Geralmente, eu não recomendo essa abordagem (atente a problemas de desempenho), mas você pode usar o operador spread para clonar superficialmente um objeto, no qual você pode acessar a propriedade.
Isso funciona porque o tipo de 'firstName' é 'propagado'.
Usarei isso com mais frequência quando tiver uma
find(...)
expressão que possa retornar nula e eu precisar de uma única propriedade:Pode haver alguns casos extremos com a maneira como o texto datilografado infere os tipos e isso não será compilado, mas geralmente deve funcionar.
fonte
Chama-se encadeamento opcional e está no Typescript 3.7
fonte
Como respondido anteriormente, ele ainda está sendo considerado, mas está morto na água há alguns anos.
Com base nas respostas existentes, aqui está a versão manual mais concisa em que consigo pensar:
jsfiddle
Simplesmente falha silenciosamente devido a erros de propriedade ausentes. Ele retorna à sintaxe padrão para determinar o valor padrão, que também pode ser omitido completamente.
Embora isso funcione em casos simples, se você precisar de coisas mais complexas, como chamar uma função e acessar uma propriedade no resultado, outros erros também serão engolidos. Projeto ruim.
No caso acima, uma versão otimizada da outra resposta postada aqui é a melhor opção:
jsfiddle
Um exemplo mais complexo:
Você também pode ir para o outro lado e usar algo como o Lodash '
_.get()
. É conciso, mas o compilador não poderá julgar a validade das propriedades usadas:fonte
Ainda não (em setembro de 2019), mas como o "operador de navegação segura" está agora no estágio 3 , está sendo implementado no TypeScript.
Assista a este problema para atualizações:
https://github.com/microsoft/TypeScript/issues/16
Vários mecanismos têm implementações iniciais:
JSC: https://bugs.webkit.org/show_bug.cgi?id=200199
V8: https://bugs.chromium.org/p/v8/issues/detail?id=9553
SM: https://bugzilla.mozilla.org/show_bug.cgi?id=1566143
(via https://github.com/tc39/proposal-optional-chaining/issues/115#issue-475422578 )
Você pode instalar um plugin para suportá-lo agora:
No seu tsconfig.json:
Espero que essa resposta esteja desatualizada nos próximos 6 meses, mas espero que ajude alguém nesse meio tempo.
fonte
_.get(obj, 'address.street.name')
funciona muito bem para JavaScript onde você não tem tipos. Mas, para o TypeScript , precisamos do verdadeiro operador Elvis!fonte