Ao olhar para o código-fonte para uma regra tslint, deparei-me com a seguinte declaração:
if (node.parent!.kind === ts.SyntaxKind.ObjectLiteralExpression) {
return;
}
Observe o !
operador depois node.parent
. Interessante!
Primeiro tentei compilar o arquivo localmente com a versão do TS atualmente instalada (1.5.3). O erro resultante apontou para a localização exata do estrondo:
$ tsc --noImplicitAny memberAccessRule.ts
noPublicModifierRule.ts(57,24): error TS1005: ')' expected.
Em seguida, atualizei para o TS mais recente (2.1.6), que o compilou sem problemas. Portanto, parece ser um recurso do TS 2.x. Mas a transpilação ignorou completamente o estrondo, resultando no seguinte JS:
if (node.parent.kind === ts.SyntaxKind.ObjectLiteralExpression) {
return;
}
Até agora, meu Google fu me falhou.
O que é o operador de ponto de exclamação da TS e como ele funciona?
fonte
console.assert()
na variável em questão antes de anexar um!
depois dela. Como o add!
está dizendo ao compilador para ignorar a verificação nula, ele é compilado para noop em javascript. Portanto, se você não tiver certeza de que a variável não é nula, faça uma verificação explícita de afirmação.dict.has(key) ? dict.get(key) : 'default';
o compilador TS não pode inferir que aget
chamada nunca retorna nula / indefinida.dict.has(key) ? dict.get(key)! : 'default';
restringe o tipo corretamente.A resposta de Louis é ótima, mas pensei em tentar resumir sucintamente:
O operador bang instrui o compilador a relaxar temporariamente a restrição "não nula" que, de outra forma, poderia exigir. Ele diz ao compilador: "Como desenvolvedor, sei melhor que você que essa variável não pode ser nula no momento".
fonte
var
oulet
são implicitamente inicializadasundefined
. Além disso, as propriedades da instância de classe podem ser declaradas como tal, portanto,class C { constructor() { this.myVar = undefined; } }
é perfeitamente legal. Finalmente, os ganchos do ciclo de vida dependem da estrutura; por exemplo, Angular e React os implementam de maneira diferente. Portanto, não se pode esperar que o compilador TS raciocine sobre eles.