#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, как вы ожидаете).