Dart - Bagaimana cara mendefinisikan interface seperti di TypeScript?


Saya berasal dari Typescript, dan di TypeScript, saya bisa mendefinisikan sebuah antarmuka dari sebuah objek seperti ini:

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

Saya mengerti bahwa Dart telah menghapus antarmuka, dan sebagai gantinya, semua kelas memiliki antarmuka implisit

Jadi saya mencoba mengimplementasikan antarmuka yang saya sebutkan di atas dengan menulis:

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?'
    )
  )
);

Tapi saya merasa ini terlalu banyak kode boilerplate.

Jadi pertanyaan saya adalah, apakah ada cara yang lebih baik untuk mengimplementasikan int

Jawaban #1

Untuk mengirim semua nilai Anda ke BaseLocale, Anda dapat mengimplementasikannya sebagai berikut:

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?');

Perlu dicatat bahwa pendekatan ini menjadikan BaseLocale bertanggung jawab untuk mengetahui properti dari dependensinya (dan secara lebih luas implementasinya) dan mungkin dianggap sebagai anti-pola oleh beberapa orang...