能否通过循环迭代简化JavaScript中的条件命名动态导入代码?
简化多语言导入逻辑的实现方案
我希望通过编程方式简化重复的命名导入与赋值代码,避免冗余,想了解是否可以借助循环实现。
当前代码
import { globalLocale } from './i18n' let locale, dateLocale if (globalLocale === 'de-DE') { const { dateDeDE, deDE } = await import('node_module') locale = deDE dateLocale = dateDeDE } else if (globalLocale === 'fr-FR') { const { dateFrFR, frFR } = await import('node_module') locale = frFR dateLocale = dateFrFR } else { const { dateEnUS, enUS } = await import('node_module') locale = enUS dateLocale = dateEnUS }
循环简化方案(可行)
你给出的循环方案确实可以实现逻辑简化,代码如下:
import { globalLocale } from './i18n' let locale, dateLocale const locales = { 'de-DE': ['deDE', 'dateDeDE'], 'fr-FR': ['frFR', 'dateFrFR'], 'en-US': ['enUS', 'dateEnUS'] } for (let lang in locales) { if (Object.prototype.hasOwnProperty.call(locales, lang)) { if (globalLocale === lang) { const { [locales[lang][0]]: currentLocale, [locales[lang][1]]: currentDateLocale } = await import('node_module') locale = currentLocale dateLocale = currentDateLocale } } }
不过这个方案存在小瑕疵:循环会遍历所有语言键,而实际上我们只需要匹配globalLocale对应的项,完全可以跳过循环,直接通过键值映射实现更高效的逻辑:
import { globalLocale } from './i18n' let locale, dateLocale const locales = { 'de-DE': ['deDE', 'dateDeDE'], 'fr-FR': ['frFR', 'dateFrFR'], 'en-US': ['enUS', 'dateEnUS'] } // 获取当前语言对应的导出键,默认用en-US const [localeKey, dateLocaleKey] = locales[globalLocale] || locales['en-US'] const { [localeKey]: currentLocale, [dateLocaleKey]: currentDateLocale } = await import('node_module') locale = currentLocale dateLocale = currentDateLocale
TypeScript 适配方案
如果使用TypeScript,需要从模块实例本身推导类型,确保类型安全:
import { globalLocale } from './i18n' import { Language } from './models' import { TDateLocale, TLocale } from 'node_module' const locales: { [key in keyof Language]: string[] } = { 'de-DE': ['deDE', 'dateDeDE'], 'fr-FR': ['frFR', 'dateFrFR'], } const moduleLocales = locales[globalLocale as keyof Language] ?? ['enUS', 'dateEnUS'] const module = await import('node_module') const locale = module[moduleLocales[0] as keyof typeof module] as TLocale const dateLocale = module[moduleLocales[1] as keyof typeof module] as TDateLocale
内容的提问来源于stack exchange,提问作者d1st0r-s1l3nt
相关产品推荐
相关产品推荐

