我有一个来自选择输入且类型为字符串的值,但是我想将其传递到函数中(更新语言) 接收带有类型别名 (Language).
我面临的问题是 Flow 只允许我打电话更新语言如果我明确地将我的字符串值与枚举字符串进行比较,并且我想使用像 array.includes 这样的数组函数。
这是我的问题的代码简化:
// @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]);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)