Nas classes TypeScript, é possível declarar tipos para propriedades, por exemplo:
class className {
property: string;
};
Como declarar o tipo de uma propriedade em um objeto literal?
Eu tentei o seguinte código, mas ele não compila:
var obj = {
property: string;
};
Estou recebendo o seguinte erro:
O nome 'string' não existe no escopo atual
Estou fazendo algo errado ou isso é um bug?
typescript
Dace Zarina
fonte
fonte
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: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:
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.Um exemplo mais longo:
Resposta original
Use o operador de conversão para tornar isso sucinto (convertendo nulo para o tipo desejado).
Um exemplo mais longo:
Isso é muito melhor do que ter duas partes (uma para declarar tipos e a segunda para declarar padrões):
fonte
property: null as string
em que a diferença importante seja oas
operador.call
no seu segundo exemplo, você pode atribuir um tipo completamente diferente a ela?Error:(33, 15) TS2352:Type 'null' cannot be converted to type 'string'.
Estou surpreso que ninguém tenha mencionado isso, mas você pode simplesmente criar uma interface chamada
ObjectLiteral
, que aceitakey: value
pares de tiposstring: any
:Então você usaria, assim:
Um bônus adicional é que você pode reutilizar essa interface quantas vezes for necessário, em quantos objetos desejar.
Boa sorte.
fonte
[key: string]
parte, e não a parte qualquer como a definição de tipo do valor ... Isso realmente eliminaria a utilidade dos tipos.Se você estiver tentando escrever uma anotação de tipo, a sintaxe é:
Se você estiver tentando escrever um objeto literal, a sintaxe é:
Seu código está tentando usar um nome de tipo em uma posição de valor.
fonte
var x: { property: string; } = ...;
é uma provocação! Eu esperava que as reticências fossem uma sintaxe válida para ser uma abreviaçãovar x: { property: string; } = { property: 'hello' };
.No TypeScript, se estamos declarando objeto, usaríamos a seguinte sintaxe:
Por exemplo:
fonte
Se você está tentando adicionar digitações a um objeto literal destruído , por exemplo, nos argumentos de uma função, a sintaxe é:
fonte
Se suas propriedades tiverem o mesmo tipo, você poderá usar o tipo de utilitário predefinido
Record
:É claro que você pode ir além e definir um tipo personalizado para seus valores de propriedade:
fonte
let
vez devar
aqui.fonte
No seu código:
Na verdade, você está criando um literal de objeto e atribuindo a sequência de variáveis à propriedade myProp. Embora seja uma prática muito ruim, esse seria realmente um código TS válido (não use isso!):
No entanto, o que você deseja é que o literal do objeto seja digitado. Isso pode ser alcançado de várias maneiras:
Interface:
Tipo personalizado:
Operador de elenco:
Tipo de objeto literal:
fonte