попытка создать абстрактную службу аутентификации с использованием универсального типа. Я хотел создать пакет Auth, который будет иметь метод New() для инициализации, но в настоящее время столкнулся с проблемой, которую я могу решить. У кого-нибудь есть идеи, возможно ли это вообще, и если это вообще способ решения проблемы?
type Register[T any] interface {
SignUp(T) (*AuthEntity, error)
}
type AuthEntity struct {
ID string
UpdatedAt time.Time
CreatedAt time.Time
}
type AuthService[T any] struct {
Register[T]
}
type PasswordStrategy struct{}
type SignUpViaPassword struct {
Email string
Password string
}
func (s PasswordStrategy) SignUp(signUpData SignUpViaPassword) (*AuthEntity, error) {
return &AuthEntity{ID: "[email protected]"}, nil
}
func New[T any](register Register[T]) AuthService[T] {
return AuthService[T]{
Register: register,
}
}
type GoogleStrategy struct{}
type SignUpViaGoogle struct {
Token string
}
func (s GoogleStrategy) SignUp(signUpData SignUpViaGoogle) (*AuthEntity, error) {
return &AuthEntity{}, nil
}
func main() {
// This works as expected
authService := AuthService[SignUpViaPassword]{
Register: PasswordStrategy{},
}
entity, err := authService.SignUp(SignUpViaPassword{Password: "Kako ide", Email: "[email protected]"})
if err != nil {
log.Println(err)
}
log.Println(entity)
// This also works as expected
googleAuthService := AuthService[SignUpViaGoogle]{
Register: GoogleStrategy{},
}
entity2, err := authService.SignUp(SignUpViaPassword{Password: "Kako ide", Email: "[email protected]"})
if err != nil {
log.Println(err)
}
log.Println(entity2)
// this doesn't work and returns error type PasswordStrategy of PasswordStrategy{} does not match Register[T] (cannot infer T)
New(PasswordStrategy{})
New(GoogleStrategy{})
}
Он не может сделать вывод, каким должен быть T
, поэтому вы можете указать его явно:
New[SignUpViaPassword](PasswordStrategy{})
Почему нет? Однако это вернет другой тип службы.
Я отредактировал рассматриваемый код, возможно, это даст вам лучшее представление о том, чего я хочу достичь.
@PetarArandjic New[SignUpViaPassword](PasswordStrategy{})
и New[SignUpViaGoogle](GoogleStrategy{})
у вас не работают?
Я знаю об этом, но в этом случае я не могу передать другую реализацию интерфейсов, таких как GoogleSignUpStrategy.