Função opcional TypeScript na interface

104

É possível criar uma interface em TypeScript com função opcional?

interface IElement {
  name: string;
  options: any;
  type: string;
  value?: string;
  validation(any): boolean; // --> should be optional.

}
Anton Selin
fonte
2
Encontrei uma resposta, acho que é possível implementar uma função opcional como esta: validação ?: (qualquer) => booleano;
Anton Selin

Respostas:

203

Atualmente, existem três sintaxes que o TypeScript permite para declarações de funções em interfaces:

Usando o seu exemplo de uma validationfunção com 1 parâmetro (do anytipo) e um booleanvalor de retorno:

validation: {(flag: any): boolean};

ou na sintaxe mais recente:

validation(flag: any) : boolean;

ou uma alternativa é:

validation: (flag: any) => boolean;

Solução:

portanto, torná-lo opcional com a sintaxe antiga é fácil:

validation?: {(flag: any): boolean};

com a segunda sintaxe (adição recente - graças a @toothbrush)

validation?(flag: any) : boolean;

ou na terceira sintaxe (como você descobriu):

validation?: (flag: any) => boolean;
Gone Coding
fonte
3
A maneira como você escreveu não anyé um tipo, mas o nome de um parâmetro que é implicitamente do tipo any. Os parâmetros devem ser nomeados, mesmo em interfaces. Este código não será compilado se --noImplicitAny estiver habilitado. Deve ser algo assim:validation?:(whatever:any) => boolean; onde whateverestá algum nome de parâmetro razoável.
NYCdotNet
@NYCdotNet: Sim, eu não deveria ter interpretado o original como lido . Corrigido :)
Gone Coding
@ gone-coding Hi! Como posso saber se a função está definida ou não?
Ilan Olkies
1
@IlanOlkies: Da mesma forma que você testa qualquer coisa em JavaScript if (object.validation):) Ele precisa ser comparado ao contexto do objeto, então if (this.validation)também pode ser apropriado dependendo da sua circunstância.
Gone Coding