Función opcional de TypeScript en la interfaz

99

¿Es posible crear una interfaz en TypeScript con función opcional?

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

}
Anton Selin
fuente
2
Encontré una respuesta, creo que es posible implementar una función opcional como esta: validación ?: (cualquiera) => booleano;
Anton Selin

Respuestas:

194

Actualmente, hay tres sintaxis que TypeScript permite para declaraciones de funciones en interfaces:

Usando su ejemplo de una validationfunción que toma 1 parámetro (de anytipo) y un booleanvalor de retorno:

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

o en la sintaxis más reciente:

validation(flag: any) : boolean;

o una alternativa es:

validation: (flag: any) => boolean;

Solución:

así que hacerlo opcional con la sintaxis anterior es fácil:

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

con la segunda sintaxis (adición reciente - gracias a @toothbrush)

validation?(flag: any) : boolean;

o en la tercera sintaxis (como encontraste):

validation?: (flag: any) => boolean;
Codificación ido
fuente
3
La forma en que lo ha escrito no anyes un tipo, sino el nombre de un parámetro que es implícitamente de tipo any. Los parámetros deben tener un nombre, incluso en las interfaces. Este código no se podrá compilar si --noImplicitAny está habilitado. Debería ser algo como esto: validation?:(whatever:any) => boolean;dónde whateverestá algún nombre de parámetro razonable.
NYCdotNet
@NYCdotNet: Sí, no debería haber tomado el original tal como se leyó . Corregido :)
Codificación desaparecida el
@ ido-codificación ¡Hola! ¿Cómo sé si la función está definida o no?
Ilan Olkies
1
@IlanOlkies: De la misma manera que prueba cualquier cosa en JavaScript if (object.validation):) Es necesario contra el contexto del objeto, por lo if (this.validation)que también puede ser apropiado según sus circunstancias.
Gone Coding