Se eu quisesse atribuir programaticamente uma propriedade a um objeto em Javascript, faria assim:
var obj = {};
obj.prop = "value";
Mas no TypeScript, isso gera um erro:
A propriedade 'prop' não existe no valor do tipo '{}'
Como devo atribuir qualquer nova propriedade a um objeto no TypeScript?
typescript
Peter Olson
fonte
fonte
Respostas:
É possível denotar
obj
comoany
, mas isso anula todo o objetivo do uso de texto datilografado.obj = {}
implicaobj
é umObject
. Marcá-lo comoany
não faz sentido. Para obter a consistência desejada, uma interface pode ser definida da seguinte maneira.OU para torná-lo compacto:
LooseObject
pode aceitar campos com qualquer sequência como chave eany
digitar como valor.A verdadeira elegância dessa solução é que você pode incluir campos de segurança tipográfica na interface.
fonte
LooseObject
pode levar um erro também.Ou tudo de uma só vez:
fonte
any
para usá-lo? Apenas se torna ruído extra no meu código ..: /any
. TypeScript é usado para capturar erros (potenciais) em tempo de compilação. Se você converter paraany
silenciar erros, perderá o poder de digitar e poderá voltar ao JS puro.any
idealmente, só deve ser usado se você estiver importando código para o qual não pode escrever definições de TS ou enquanto estiver migrando seu código de JS para TSEu costumo colocar
any
do outro lado, ou seja,var foo:IFoo = <any>{};
algo assim ainda é seguro:Como alternativa, você pode marcar essas propriedades como opcionais:
Experimente online
fonte
I still have <any>{
então você não compilou. Typescript removeria que em sua Emitvar foo: IFoo = {} as any
é o preferido. A sintaxe antiga para a conversão de tipos estava colidindo com o TSX (JSX datilografado).Esta solução é útil quando seu objeto possui um tipo específico. Como ao obter o objeto para outra fonte.
fonte
Embora o compilador reclame, ele ainda deve gerá-lo conforme necessário. No entanto, isso vai funcionar.
fonte
Mais uma opção a fazer é acessar a propriedade como uma coleção:
fonte
Object.assign(obj, {prop: "value"})
do ES6 / ES2015 também funciona.Estou surpreso que nenhuma das respostas faça referência a Object.assign, pois essa é a técnica que uso sempre que penso em "composição" em JavaScript.
E funciona como esperado no TypeScript:
Vantagens
any
tipo&
ao declarar o tipo deobjectWithAllProps
), que comunica claramente que estamos compondo um novo tipo on-the-fly (ou seja, dinamicamente)Coisas para estar ciente
existingObject
permanece intocado e, portanto, não possui umaemail
propriedade. Para a maioria dos programadores de estilo funcional, isso é bom, pois o resultado é a única nova mudança).fonte
Você pode criar um novo objeto com base no objeto antigo usando o operador de propagação
O TypeScript inferirá todos os campos do objeto original e o VSCode executará o preenchimento automático, etc.
fonte
Mais simples seguirá
fonte
É possível adicionar um membro a um objeto existente,
fonte
Como você não pode fazer isso:
Se o seu compilador TS e seu linter não o restringem, você pode escrever o seguinte:
Se o seu compilador ou ponteiro TS for rigoroso, outra resposta seria digitar:
fonte
Armazene qualquer nova propriedade em qualquer tipo de objeto digitando-a como 'any':
Posteriormente, você pode recuperá-lo lançando seu objeto estendido de volta para 'any':
fonte
Para garantir que o tipo seja um
Object
(ou seja , pares de valores-chave ), use:fonte
Caso 1:
var car = {type: "BMW", model: "i8", color: "white"}; car['owner'] = "ibrahim"; // You can add a property:
Caso 2:
var car:any = {type: "BMW", model: "i8", color: "white"}; car.owner = "ibrahim"; // You can set a property: use any type
fonte
você pode usar isso:
fonte
Você pode adicionar esta declaração para silenciar os avisos.
declare var obj: any;
fonte
A melhor prática é usar a digitação segura, eu recomendo que você:
fonte
Para preservar seu tipo anterior, projete temporariamente seu objeto em qualquer
A nova propriedade dinâmica estará disponível apenas quando você usar o elenco:
fonte
Aqui está uma versão especial de
Object.assign
, que ajusta automaticamente o tipo de variável a cada alteração de propriedade. Não há necessidade de variáveis adicionais, asserções de tipo, tipos explícitos ou cópias de objetos:Nota: A amostra utiliza as funções de asserção TS 3.7 . O tipo de retorno de
assign
évoid
diferenteObject.assign
.fonte
Se você estiver usando o Typecript, provavelmente você deseja usar o tipo safety; nesse caso, Objeto nu e 'qualquer' são contra-indicados.
Melhor não usar Object ou {}, mas algum tipo nomeado; ou você pode estar usando uma API com tipos específicos, que você precisa estender com seus próprios campos. Descobri que isso funciona:
fonte
atribuir dinamicamente propriedades a um objeto no TypeScript.
para fazer isso Você só precisa usar interfaces de texto datilografado da seguinte maneira:
você pode usá-lo assim
fonte
attributes
campo dentroSomeClass
e isso deve corrigi-lopublic attributes: IType = {};
pastebin.com/3xnu0TnNTente o seguinte:
Então use
fonte
A única solução totalmente segura para o tipo é essa , mas é um pouco prolixo e obriga a criar vários objetos.
Se você deve criar um objeto vazio primeiro, escolha uma dessas duas soluções. Lembre-se de que toda vez que você usa
as
, perde a segurança.Solução mais segura
O tipo de
object
é seguro por dentrogetObject
, o que significa queobject.a
será do tipostring | undefined
Solução curta
O tipo de não
object
é seguro por dentrogetObject
, o que significa queobject.a
será do tipostring
mesmo antes de sua atribuição.fonte