Вы не можете сделать значение из типа, но вы можете вывести тип из значения. Это означает, что вы должны начать с некоторого значения времени выполнения и заставить компилятор вывести из него тип Regions
.
Например, вы можете создать массив допустимых имен регионов:
const Regions = ["", "eu-west-1", "eu-east-1", "us-west-1",
"us-east-1", "ap-southeast-1", "ap-east-1"] as const;
type Regions = typeof Regions[number];
Вы можете проверить, что тип Regions
такой же, как в вашем определении. Затем вы можете использовать массив, чтобы проверить, что строка является допустимой Regions
(например, когда вы реализуете функцию защиты определяемого пользователем типа ):
function checkRegion(region: string): region is Regions {
return (Regions as readonly string[]).indexOf(region) >= 0;
}
Или, если вы хотите использовать in
, вы можете создать объект, ключи которого являются значениями, которые вам нужны, вместо создания массива:
const Regions = {
"": true,
"eu-west-1": true,
"eu-east-1": true,
"us-west-1": true,
"ap-southeast-1": true,
"ap-east-1": true
}
type Regions = keyof typeof Regions;
И снова вы можете проверить, что Regions
является правильный тип и используйте in
:
function checkRegion(region: string): region is Regions {
return region in Regions;
}
Вы можете использовать enum
, как указано выше, но вам нужно быть осторожным, так как numeri * Перечисления 1045 * имеют обратное отображение , поэтому "0" in RegionsEnum
равно true
, что, возможно, удивительно. Если бы вы все же предпочли использовать это, это могло бы выглядеть так:
enum RegionsEnum {
"", "eu-west-1", "eu-east-1", "us-west-1", "ap-southeast-1", "ap-east-1"
}
type Regions = keyof typeof RegionsEnum;
function checkRegion(region: string): region is Regions {
return (region !== (+region) + "") && region in RegionsEnum;
}
(обратите внимание на дополнительный бит кода, удостоверяющий, что region
не является "numeri c string").
Хорошо, надеюсь, это поможет; удачи!
Детская площадка ссылка на код