Ou então, com uma declaração de tipo, mas você perderá a segurança de tipo, pois agora ficará indefinido em locais inesperados e possivelmente erros de tempo de execução ao acessar modal.contente assim por diante (propriedades que o contrato diz que estarão lá).
Você pode pensar "ei, isso é realmente uma duplicação da interface" - e você está correto. Se a classe Modal for a única implementação da interface IModal, você poderá excluir a interface completamente e usar ...
Obrigado. Eu esperava deixar de ter que definir todo o conteúdo modal inicialmente. Seria mais fácil se, em vez de uma interface, eu definisse Modal como uma classe com propriedades e usasse new e um construtor para configurar todos os valores iniciais?
1
Sim - você pode definir uma classe e só precisará criar novas instâncias quando precisar delas. Você precisa de um exemplo?
Fenton
2
Eu adicionei um exemplo e uma observação sobre a interface.
Fenton
21
var modal = <IModal>{};era isso que eu estava procurando ;-) obrigado!
Legends
5
Para sua informação, é melhor usar {} as IModaldo que usar <IModal>{}. Remove uma ambiguidade na gramática do idioma ao usar <foo>asserções de estilo em JSX. Leia mais . E, claro, use letou em constvez de var.
Alex Klaus
191
Se você deseja um objeto vazio de uma interface, pode fazer exatamente:
var modal =<IModal>{};
A vantagem de usar interfaces no lugar de classes para estruturar dados é que, se você não tiver nenhum método na classe, ele será exibido no JS compilado como um método vazio. Exemplo:
que não carrega valor. As interfaces, por outro lado, não aparecem no JS, ao mesmo tempo em que fornecem os benefícios da estruturação de dados e da verificação de tipo.
`Para adicionar ao comentário acima. Para chamar uma função "updateModal (IModal modalInstance) {}", você pode criar uma instância embutida da interface 'IModal', assim: // algum código aqui, onde a função updateModal e IModal estão acessíveis: updateModal (<IModal> {// esta linha cria um conteúdo da instância: '', form: '', href: '', $ form: null, $ message: null, $ modal: null, $ submete: null}); // complete seu código `
Sunny
usando var modal= <abc>{}apenas atribuímos o modal do tipo abc do objeto vazio, mas onde declaramos o tipo de modal? Estou usando o typescript6.
Pardeep Jain
Isso não funcionou para mim. Eu tive que inicializar todo o objeto, conforme indicado na resposta aceita.
Rahul Sonwanshi 27/02
52
Se você estiver usando o React, o analisador engasgará com a sintaxe de conversão tradicional, portanto, uma alternativa foi introduzida para uso em arquivos .tsx
Eu acho que você tem basicamente cinco opções diferentes para fazer isso. Escolher entre eles pode ser fácil, dependendo do objetivo que você deseja alcançar.
A melhor maneira, na maioria dos casos, de usar uma classe e instancia-la , porque você está usando o TypeScript para aplicar a verificação de tipo.
Mesmo que outros métodos ofereçam maneiras mais fáceis de criar um objeto a partir de uma interface, considere dividir sua interface , se você estiver usando seu objeto para assuntos diferentes e isso não causar excesso de segregação de interface:
Por outro lado, por exemplo, durante o teste unitário de seu código (se você não aplicar a separação de preocupações com frequência), poderá aceitar as desvantagens por uma questão de produtividade. Você pode aplicar outros métodos para criar simulações principalmente para grandes interfaces de terceiros * .d.ts. E pode ser difícil implementar sempre objetos anônimos completos para todas as interfaces enormes.
Nesse caminho, sua primeira opção é criar um objeto vazio :
var modal =<IModal>{};
Em segundo lugar, para realizar plenamente a parte obrigatória da sua interface . Pode ser útil se você estiver chamando bibliotecas JavaScript de terceiros, mas acho que você deve criar uma classe, como antes:
var modal:IModal={
content:'',
form:'',//...
foo:(param: string):void=>{}};
Terceiro, você pode criar apenas uma parte da sua interface e criar um objeto anônimo , mas dessa forma você é responsável por cumprir o contrato
var modal:IModal=<any>{
foo:(param: string):void=>{}};
Resumindo minha resposta, mesmo que as interfaces sejam opcionais, porque não são transpiladas para o código JavaScript, o TypeScript existe para fornecer um novo nível de abstração, se usado com sabedoria e consistência. Eu acho que só porque você pode descartá-los na maioria dos casos do seu próprio código, não deveria.
classModal(){constructor(public iModal:IModal){//You now have access to all your interface variables using this.iModal object,//you don't need to define the properties at all, constructor does it for you.}}
Muitas das soluções postadas até agora usam asserções de tipo e, portanto , não geram erros de compilação se as propriedades de interface necessárias forem omitidas na implementação.
Para os interessados em outras soluções robustas e compactas :
Opção 1: Instanciar uma classe anônima que implementa a interface:
var modal = <IModal>{};
era isso que eu estava procurando ;-) obrigado!{} as IModal
do que usar<IModal>{}
. Remove uma ambiguidade na gramática do idioma ao usar<foo>
asserções de estilo em JSX. Leia mais . E, claro, uselet
ou emconst
vez devar
.Se você deseja um objeto vazio de uma interface, pode fazer exatamente:
A vantagem de usar interfaces no lugar de classes para estruturar dados é que, se você não tiver nenhum método na classe, ele será exibido no JS compilado como um método vazio. Exemplo:
compila em
que não carrega valor. As interfaces, por outro lado, não aparecem no JS, ao mesmo tempo em que fornecem os benefícios da estruturação de dados e da verificação de tipo.
fonte
var modal= <abc>{}
apenas atribuímos o modal do tipo abc do objeto vazio, mas onde declaramos o tipo de modal? Estou usando o typescript6.Se você estiver usando o React, o analisador engasgará com a sintaxe de conversão tradicional, portanto, uma alternativa foi introduzida para uso em arquivos .tsx
https://www.typescriptlang.org/docs/handbook/jsx.html
fonte
Eu acho que você tem basicamente cinco opções diferentes para fazer isso. Escolher entre eles pode ser fácil, dependendo do objetivo que você deseja alcançar.
A melhor maneira, na maioria dos casos, de usar uma classe e instancia-la , porque você está usando o TypeScript para aplicar a verificação de tipo.
Mesmo que outros métodos ofereçam maneiras mais fáceis de criar um objeto a partir de uma interface, considere dividir sua interface , se você estiver usando seu objeto para assuntos diferentes e isso não causar excesso de segregação de interface:
Por outro lado, por exemplo, durante o teste unitário de seu código (se você não aplicar a separação de preocupações com frequência), poderá aceitar as desvantagens por uma questão de produtividade. Você pode aplicar outros métodos para criar simulações principalmente para grandes interfaces de terceiros * .d.ts. E pode ser difícil implementar sempre objetos anônimos completos para todas as interfaces enormes.
Nesse caminho, sua primeira opção é criar um objeto vazio :
Em segundo lugar, para realizar plenamente a parte obrigatória da sua interface . Pode ser útil se você estiver chamando bibliotecas JavaScript de terceiros, mas acho que você deve criar uma classe, como antes:
Terceiro, você pode criar apenas uma parte da sua interface e criar um objeto anônimo , mas dessa forma você é responsável por cumprir o contrato
Resumindo minha resposta, mesmo que as interfaces sejam opcionais, porque não são transpiladas para o código JavaScript, o TypeScript existe para fornecer um novo nível de abstração, se usado com sabedoria e consistência. Eu acho que só porque você pode descartá-los na maioria dos casos do seu próprio código, não deveria.
fonte
Você pode fazer
fonte
Como não encontrei uma resposta igual no topo e minha resposta é diferente. Eu faço:
fonte
Usando sua interface, você pode fazer
fonte
Aqui está outra abordagem:
Você pode simplesmente criar um objeto compatível com ESLint como este
Ou uma instância padrão baseada na interface e com padrões sensíveis, se houver
Em seguida, variações da instância padrão simplesmente substituindo algumas propriedades
fonte
Muitas das soluções postadas até agora usam asserções de tipo e, portanto , não geram erros de compilação se as propriedades de interface necessárias forem omitidas na implementação.
Para os interessados em outras soluções robustas e compactas :
Opção 1: Instanciar uma classe anônima que implementa a interface:
Opção 2: Crie uma função de utilitário:
fonte
Você pode definir valores padrão usando
Class
.Sem construtor de classe:
Com construtor de classe
fonte