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.

}

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;

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.