Búsqueda de sitios web

Dart - ¿Cómo definir una interfaz como en TypeScript?


Vengo de TypeScript, y en TypeScript, podría definir una interfaz de un objeto así:

export interface Locale {
  login: {
    title: string;
    actions: {
      submit: string;
      forgot: string;
    }
  }
}

Entiendo que Dart ha eliminado las interfaces y, en su lugar, todas las clases tienen interfaces implícitas

Así que intenté implementar la interfaz que mencioné arriba escribiendo:

class BaseLoginActionsLocale {
  final String submit;
  final String forgot;

  BaseLoginActionsLocale({this.submit, this.forgot});
}

class BaseLoginLocale {
  final String title;
  final BaseLoginActionsLocale actions;

  BaseLoginLocale({this.title, this.actions});
}

class BaseLocale {
  final BaseLoginLocale login;

  BaseLocale({this.login});
}

...

final BaseLocale enLocale = BaseLocale(
  login: BaseLoginLocale(
    title: 'Login',
    actions: BaseLoginActionsLocale(
      submit: 'Login',
      forgot: 'Forgot Password?'
    )
  )
);

Pero siento que es demasiado código repetitivo.

Entonces mi pregunta es, ¿hay una mejor manera de implementar un int?

Respuesta #1

Para pasar todos tus valores al BaseLocale, podrías implementarlo de la siguiente manera:

class BaseLoginActionsLocale {
  final String submit;
  final String forgot;

  BaseLoginActionsLocale(this.submit, this.forgot);
}

class BaseLoginLocale {
  final String title;
  final BaseLoginActionsLocale actions;

  BaseLoginLocale(this.title, submit, forgot) : actions = new BaseLoginActionsLocale(submit, forgot);
}

class BaseLocale {
  final BaseLoginLocale login;

  BaseLocale(title, submit, forgot) : login = new BaseLoginLocale(title, submit, forgot);  
}

final BaseLocale enLocale = BaseLocale('Login', 'Login', 'Forgot Password?');

Tenga en cuenta que este enfoque hace que sea responsabilidad de BaseLocale conocer las propiedades de sus dependencias (y por extensión la implementación) y puede ser considerado un anti-patrón por algunos...