Как объявить пользовательский тип для параметра функции?

#dart #types

#dart #типы

Вопрос:

Я хотел бы ввести параметры моей функции, чтобы получить полный код для возможных значений параметра «метод».

Если бы мне пришлось делать это с помощью Typescript, я бы сделал что-то вроде этого:

 type MethodType = 'GET' | 'POST' | 'PUT' | 'DELETE'

const fetcher = async (method: MethodType) => {
  ...
}
  

По сути, я создал тип, содержащий некоторые значения, и использовал его в качестве ввода для method аргумента.

Как я могу сделать то же самое с помощью Dart?

 Future fetcher(String method = 'GET') async {
  ...
}
  

Комментарии:

1. Пожалуйста, опишите, что делает этот код typescript, чтобы те, кто не знает typescript, могли ответить.

Ответ №1:

Если я чего-то не упустил, это звучит как точный вариант использования для enum .

Вот как вы могли бы его использовать, основываясь на вашем примере:

 enum HttpMethod {
  GET, POST, PUT, DELETE
}

Future fetcher(HttpMethod method = HttpMethod.GET) async {
  // do stuff
}
  

Примечание: Рекомендации по стилю dart рекомендуют использовать lowerCamelCase константы for в новом коде, но я использовал SCREAMING_CAPS выше, чтобы соответствовать вашему коду и фактическим именам HTTP-методов.

Комментарии:

1. Спасибо, это работает! Но я думал о передаче a String вместо HTTPMethod перечисления в качестве аргумента метода, например, так: fetcher(method: 'GET') вместо fetcher(method: HttpMethod.GET) . Как вы думаете, это можно сделать?

2. Вы не можете определить тип как просто определенный набор значений в Dart. Для этого и нужны перечисления, а не строки.

3. Как сказал @Irn, вы не можете создавать такие пользовательские типы. Если вы по какой-то причине не можете использовать перечисления (я не знаю почему; вы можете расширить их с помощью методов расширения), вы могли бы сделать что-то странное, например, подкласс String для ваших нужд. Но в этом случае вы все равно можете использовать исключение недопустимого аргумента или что-то подобное (я не могу вспомнить, есть ли у Dart исключение InvalidArgumentException — в последнее время я много работал с Java).

4. Если вы хотите использовать строку, потому что хотите иметь возможность получать значение в виде строки, вы можете сделать это с помощью метода расширения в enum (не могу вспомнить, поддерживает ли enum toString, как вы ожидаете).