Vscode-ng-language-service: typecript 2.7 inicialização de propriedade estrita quebra a inferência de tipo

Criado em 3 fev. 2018  ·  6Comentários  ·  Fonte: angular/vscode-ng-language-service

Eu atualizei para o typescript 2.7 com o novo recurso de inicialização de propriedade estrita: https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-7.html

Isso significa que ele avisará se as propriedades obrigatórias não forem inicializadas no construtor. Isso é bastante comum com entradas de componentes obrigatórias. Eles não são definidos a partir do construtor, então TS reclamará de:

@Component(...)
export class AppComponent {
  @Input() foo: Foo;
}

já que foo nunca é inicializado. Você pode corrigir isso com uma declaração manual de que a propriedade será definida durante a inicialização (observe o ponto de exclamação na declaração de propriedade foo):

@Component(...)
export class AppComponent {
  @Input() foo!: Foo;
}

No entanto, depois de fazer isso, a inferência de tipo de serviço de linguagem angular em relação ao código quebra com um erro [Angular] Identifier 'name' is not defined. '<anonymous>' does not contain such a member :
image

Para um repo de reprodução, consulte https://github.com/wvanderdeijl/angular-strict-prop-init

Comentários muito úteis

A boa notícia é que o TS 2.7 é compatível com a versão 0.1.10 recém-lançada. A má notícia é que ainda estou vendo esse erro e ele pode estar relacionado a esse problema. O objeto que está sendo referenciado tem uma assinatura de índice de chave, em vez de uma afirmação de atribuição definida, mas os sintomas são os mesmos. Se for o mesmo problema, cf # 149 e # 126.

Todos 6 comentários

Infelizmente, o TS 2.7 não é compatível com o Angular. Como agora foi lançado oficialmente, o Angular deve adicionar suporte em breve.

@hccampos , você conhece alguma solução alternativa? Obtendo a mesma coisa sem sentido no meu HTML.

@wvanderdeijl , entretanto, use "strictPropertyInitialization": false, . Estou usando o ts 2.7 também, não apenas porque --watch é mais rápido, mas também corrige importações automáticas relativas no vscode.

A longo prazo, não vejo nenhuma maneira razoável de como o Angular será capaz de resolver isso. Eu acho que é melhor sempre fornecer valores padrão para suas entradas sem ter que usar o modificador de asserção de atribuição definida ! .

Ou, para ser programaticamente correto, ative o sinalizador e faça o seguinte:

@Component({
  selector: 'app-test',
  template: '<div>{{ foo?.name }}</div>'
})
export class AppComponent {
  // foo can be undefined
  // both TS 2.7 and language service will compile correctly
  @Input() foo?: Foo;
  // or you can write @Input() foo: Foo | void = undefined; which is the same as above, just more explicit
}

Por que isso está ok? bem o compilador angular não tem nenhuma capacidade de fazer adereços realmente necessários,
então, mesmo que você não torne o Input "obrigatório" na classe, você ainda pode escrever <app-test><app-test> e o compilador não lançará nenhum erro, mesmo se a propriedade Input não for opcional 👎

A boa notícia é que o TS 2.7 é compatível com a versão 0.1.10 recém-lançada. A má notícia é que ainda estou vendo esse erro e ele pode estar relacionado a esse problema. O objeto que está sendo referenciado tem uma assinatura de índice de chave, em vez de uma afirmação de atribuição definida, mas os sintomas são os mesmos. Se for o mesmo problema, cf # 149 e # 126.

Fechando isso, já que o Angular agora usa TypeScript 3.6.
Atualize para a versão mais recente e informe-nos se você ainda tiver esse problema. Obrigado!

Este problema foi bloqueado automaticamente devido à inatividade.
Registre um novo problema se você estiver encontrando um problema semelhante ou relacionado.

Leia mais sobre nossa política de bloqueio automático de conversas .

_Esta ação foi executada automaticamente por um bot._

Esta página foi útil?
0 / 5 - 0 avaliações