javascript - Flowtype - 字符串与字符串枚举不兼容

标签 javascript string enums typechecking flowtype

我有一个来自选择输入的字符串类型的值,但是我想将它传递给一个函数 (updateLanguage),该函数接收一个字符串枚举作为参数,类型别名 ( 语言)。

我面临的问题是,如果我明确地将我的字符串值与枚举字符串进行比较并且我想使用像 array.includes 这样的数组函数,Flow 只允许我调用 updateLanguage

这是我的问题的代码简化:

// @flow

type SelectOption = {
    value: string
};
const selectedOption: SelectOption = {value: 'en'};

type Language = 'en' | 'pt' | 'es';
const availableLanguages: Language[] = ['en', 'pt'];

function updateLanguage(lang: Language) {
    // do nothing
}

// OK
if(selectedOption.value === 'en' || selectedOption.value === 'pt') {
  updateLanguage(selectedOption.value);
}

// FLOWTYPE ERRORS
if(availableLanguages.includes(selectedOption.value)) {
  updateLanguage(selectedOption.value);
}

运行流 v0.30.0 给出以下输出:

example.js:21
 21: if(availableLanguages.includes(selectedOption.value)) {
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ call of method `includes`
 21: if(availableLanguages.includes(selectedOption.value)) {
                                    ^^^^^^^^^^^^^^^^^^^^ string. This type is incompatible with
  9: const availableLanguages: Language[] = ['en', 'pt'];
                               ^^^^^^^^ string enum

example.js:22
 22:   updateLanguage(selectedOption.value);
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ function call
 22:   updateLanguage(selectedOption.value);
                      ^^^^^^^^^^^^^^^^^^^^ string. This type is incompatible with
 11: function updateLanguage(lang: Language) {
                                   ^^^^^^^^ string enum


Found 2 errors

如何以可扩展的方式检查字符串值是否是枚举的一部分?

最佳答案

这是一个可扩展且安全的解决方案:

const languages = {
  en: 'en',
  pt: 'pt',
  es: 'es'
};

type Language = $Keys<typeof languages>;

const languageMap: { [key: string]: ?Language } = languages;

function updateLanguage(lang: Language) {
    // do nothing
}

type SelectOption = {
    value: string
};
const selectedOption: SelectOption = {value: 'en'};

if(languageMap[selectedOption.value]) {
  updateLanguage(languageMap[selectedOption.value]);
}

关于javascript - Flowtype - 字符串与字符串枚举不兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38825773/

相关文章:

java - 过滤机会枚举并根据随机机会选择一个

java - 如何使用 Scala 中的 Enum.valueOf?

javascript - jQuery UI slider 给出 : Uncaught Syntax error, 无法识别的表达式:#

javascript - Highcharts 从 XML 生成柱形图

python - 强制 ElementTree 使用结束标签

c++ - std::basic_string<_CharT> 字符串的最大长度

java - 枚举的 values() 方法访问级别

javascript - 将 noUISlider 的最小/最大值保存到变量

javascript - requirejs:这些建立模块需求的方法有什么区别?

string - 如何将类型转换定义为自定义类型的字符串