Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Flowtype-字符串与字符串枚举不兼容_Javascript_String_Enums_Typechecking_Flowtype - Fatal编程技术网

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

Javascript Flowtype-字符串与字符串枚举不兼容,javascript,string,enums,typechecking,flowtype,Javascript,String,Enums,Typechecking,Flowtype,我有一个来自select输入的字符串类型的值,但是我想将其传递到一个函数(updateLanguage),该函数接收一个带有类型别名(语言)的字符串枚举作为参数 我面临的问题是,如果我显式地将字符串值与枚举字符串进行比较,并且希望使用array.includes之类的数组函数,那么Flow只允许我调用updateLanguage 这是我问题的代码简化: // @flow type SelectOption = { value: string }; const selectedOptio

我有一个来自select输入的字符串类型的值,但是我想将其传递到一个函数(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]);
}
const语言={
嗯:"嗯",,
pt:‘pt’,
es:“es”
};
类型语言=$Keys;
const languageMap:{[key:string]:?Language}=languages;
函数更新语言(lang:Language){
//无所事事
}
类型选择选项={
值:字符串
};
const selectedOption:SelectOption={value:'en'};
if(languageMap[selectedOption.value]){
updateLanguage(languageMap[selectedOption.value]);
}